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»
Пример, конечно, сильно упрощенный, но принцип тот же.