Post mortem: siga o middleware ou como quebramos os comentários

Oi Não temos notícias muito boas: cometemos um erro na versão móvel, o que poderia perturbá-lo todos os feriados.



A essência do problema: uma pessoa envia um comentário para uma postagem, o vê com seu nome de usuário e sai da página, mas se você atualizar a página, esse comentário já estará com um nome de usuário diferente. Isso funcionou apenas se os usuários estivessem simultaneamente na página de uma postagem.


Segundo nossos dados, no fim de semana, 774 comentários foram enviados da versão móvel. Cada um deles poderia sofrer.


Alguns detalhes técnicos

Usamos um monte de VueJS + NodeJS (Express, SSR).


O NodeJS serve várias conexões em um único fluxo de forma assíncrona, ou seja, usa uma instância para todos os clientes. Isso significa que as variáveis ​​globais são inicializadas apenas uma vez e permanecem ativas enquanto a instância estiver ativa.


Portanto, você deve ser extremamente cuidadoso com a ordem de execução do middlewar'ov, bem como com a definição e redefinição dos valores das variáveis ​​(especialmente se forem globais).


E foi isso que aconteceu conosco (este é um exemplo de código):


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); }); 

O que o servidor retornará?


  • Cliente 1 em /main >>> 'bar'
  • Cliente 2 em /change >>> 'barbar'
  • Cliente 1 novamente em /main >>> 'barbar'

O exemplo, é claro, é bastante simplificado, mas o princípio é o mesmo.


Agora tudo funciona como deveria. Perdoe a inconveniência e, se você for afetado por esse problema, entre em contato conosco através do formulário de feedback .


Estamos à procura de uma oportunidade para retornar os comentários aos seus legítimos proprietários. Contaremos o que aconteceu depois.

Source: https://habr.com/ru/post/pt443268/


All Articles