Post mortem: suivez le middleware ou comment nous avons rompu les commentaires

Salut Nous n'avons pas de très bonnes nouvelles: nous avons fait une erreur dans la version mobile, ce qui pourrait vous déranger pendant toutes les vacances.



L'essence du problème: une personne envoie un commentaire à un message, le voit avec son identifiant et quitte la page, mais si vous actualisez la page, ce commentaire sera déjà sous un nom d'utilisateur différent. Cela ne fonctionnait que si les utilisateurs étaient simultanément sur la page d'un article.


Selon nos données, au cours du week-end, 774 commentaires ont été envoyés depuis la version mobile. Chacun d'eux pourrait souffrir.


Quelques détails techniques

Nous utilisons un tas de VueJS + NodeJS (Express, SSR).


NodeJS sert plusieurs connexions dans un même flux de manière asynchrone, c'est-à-dire qu'il utilise une instance pour tous les clients. Cela signifie que les variables globales ne sont initialisées qu'une seule fois et vivent tant que l'instance est vivante.


Par conséquent, vous devez être extrêmement prudent sur l'ordre d'exécution de middlewar'ov, ainsi que sur la définition et la redéfinition des valeurs de variable (surtout si elles sont globales).


Et c'est ce qui nous est arrivé (c'est un exemple de code):


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

Que va rendre le serveur?


  • Client 1 sur /main >>> 'bar'
  • Client 2 at /change >>> 'barbar'
  • Client 1 à nouveau activé /main >>> 'barbar'

L'exemple, bien sûr, est grandement simplifié, mais le principe est le même.


Maintenant, tout fonctionne comme il se doit. Veuillez excuser la gêne occasionnée et si vous êtes concerné par ce problème, veuillez nous contacter via le formulaire de commentaires .


Nous recherchons une opportunité de retourner les commentaires à leurs propriétaires légitimes, nous vous dirons ce qui en est arrivé plus tard.

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


All Articles