Post mortem: cледи за middleware или как мы сломали комментарии

4ff9nutagu7mnz6llaqeonv3ghs.jpeg

Мы используем связку VueJS + NodeJS (Express, SSR).

NodeJS обслуживает в один поток асинхронно сразу множество соединений, то есть использует один инстанс на всех клиентов. Это значит, что глобальные переменные инициализируются только один раз и живут до тех пор, пока жив инстанс.

Поэтому необходимо крайне внимательно относиться к порядку выполнения middlewar’ов, а также к определению и переопределению значений переменных (особенно, если они глобальные).

И вот что с нами случилось (это пример кода):

global.foo = 'bar';

app.get('/main', (req, res, next) => {
  res.send(global.foo);
});

app.get('/change', (req, res, next) => {
  global.foo = global.foo === 'bar' ? 'barbar': 'bar';
  res.send(global.foo);
});


Что вернёт сервер?


  • Клиент 1 на /main >>> «bar»
  • Клиент 2 на /change >>> «barbar»
  • Клиент 1 снова на /main >>> «barbar»

Пример, конечно, сильно упрощенный, но принцип тот же.

© Habrahabr.ru