понедельник, 11 марта 2019 г.

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

Мы используем связку 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’

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

Let's block ads! (Why?)

Комментариев нет:

Отправить комментарий