Post mortem: Folgen Sie der Middleware oder wie wir Kommentare gebrochen haben

Hallo! Wir haben keine sehr guten Nachrichten: Wir haben in der mobilen Version einen Fehler gemacht, der Sie alle Feiertage stören könnte.



Das Wesentliche des Problems: Eine Person sendet einen Kommentar an einen Beitrag, sieht ihn mit ihrem Benutzernamen und verlässt die Seite. Wenn Sie die Seite jedoch aktualisieren, befindet sich dieser Kommentar bereits unter einem anderen Benutzernamen. Dies funktionierte nur, wenn Benutzer gleichzeitig auf der Seite eines Beitrags waren.


Nach unseren Angaben wurden am Wochenende 774 Kommentare von der mobilen Version gesendet. Jeder von ihnen könnte leiden.


Einige technische Details

Wir verwenden eine Reihe von VueJS + NodeJS (Express, SSR).


NodeJS bedient mehrere Verbindungen in einem einzelnen Stream asynchron, dh es wird eine Instanz für alle Clients verwendet. Dies bedeutet, dass globale Variablen nur einmal initialisiert werden und so lange aktiv sind, wie die Instanz aktiv ist.


Daher müssen Sie äußerst vorsichtig mit der Ausführungsreihenfolge von Middlewar'ov sowie der Definition und Neudefinition der Werte von Variablen sein (insbesondere wenn diese global sind).


Und genau das ist uns passiert (dies ist ein Codebeispiel):


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

Was wird der Server zurückgeben?


  • Client 1 on /main >>> 'bar'
  • Client 2 at /change >>> 'barbar'
  • Client 1 wieder auf /main >>> 'barbar'

Das Beispiel ist natürlich stark vereinfacht, aber das Prinzip ist dasselbe.


Jetzt funktioniert alles wie es sollte. Bitte verzeihen Sie die Unannehmlichkeiten. Wenn Sie von diesem Problem betroffen sind, kontaktieren Sie uns bitte über das Feedback-Formular .


Wir suchen nach einer Möglichkeit, die Kommentare an ihre rechtmäßigen Eigentümer zurückzugeben. Wir werden Ihnen später mitteilen, was daraus geworden ist.

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


All Articles