2016-01-01 7 views
11

Ich verwende Express und muss jedes Mal auf Daten zugreifen, die auf der Anfrage stehen (Header, Cookies usw.), wenn ich das Protokoll zum Debuggen und Tracen meiner App verwende.Zugriffsanforderungskontext überall

Mit anderen Sprachen (zB: Java) Ich habe den "Thread-Kontext", wo ich diese Daten setzen kann, und so auf sie zugreifen, wenn ich etwas loggen. Aber mit NodeJS gibt es soweit ich weiß nichts, weil wir nur einen Thread haben.

Ich versuche zu vermeiden, die req Variable in jeder Funktion übergeben, damit ich diese Informationen protokollieren kann.

Gibt es einen Knoten oder eine expressjs-Funktion, mit der ich die Daten überall hin bekommen kann?

+2

Es gibt Module - aber ehrlich implizite Anfrage - globale Variablen sind schrecklich und Sie sollten sie so viel wie Sie vermeiden können. Nur Ihr Routenmanager selbst sollte auf die Anfrage zugreifen und dann nur relevante Teile an die Teile weitergeben, die sie benötigen. –

+1

@Amit es ist eine legitime Frage - ich denke, es kann bearbeitet werden, um mehr legit zu sein, indem Sie den Teil entfernen, der sagt "gibt es ein Modul" und lassen Sie es bei "gibt es ein Express-oder Knoten-Feature" –

+0

Neuquino - siehe @BenjaminGruenbaum Kommentar. Bitte bearbeiten Sie Ihre Frage. – Amit

Antwort

-2

Die Tatsache, dass JavaScript single threaded ist, ist keine Einschränkung und verhindert nicht die Verwendung von "Thread Context" als Mittel zur Verwendung von "universal accessible state". Die Probleme beginnen, sobald asynchrone Aufrufe gemacht werden und der Zustand nicht mehr dem entspricht, was Sie vorhaben.

Dies ist einer der Gründe, warum globaler Zustand als "schlechte Angewohnheit" betrachtet wird und Sie sollten es vermeiden (nicht speziell bei der Entwicklung in JavaScript und/oder Node ...).

Stattdessen sollten Sie übergeben ein Objekt, aber nicht req. Sie sollten Ihre Objekte konstruieren oder Ihre Funktionen so aufrufen, dass die Instanz log, die für jede Aufrufkette relevant ist (beginnend beim Anforderungsereignis und über alle internen Aufrufe), weitergegeben wird. Diese log Instanz sollte mit dem für die Protokollierung erforderlichen Kontext initialisiert werden, und in Ihrem Fall die Anfragedetails aus dem ursprünglichen req.

+6

Ich glaube nicht, dass das Hinzufügen eines zusätzlichen Arguments zu ALLEN meinen Funktionen in ALLEN meinen Modulen nur für die Protokollierung eine elegante Lösung wäre. Ich weiß, es wird nicht so einfach sein wie 'var log = require ('myLog'); log.debug ('etwas') '. Aber ich versuche so etwas zu erreichen. – Neuquino

+3

Natürlich gibt es Wege - die trivialsten sind: Domänen, Zonen, Versprechen Bibliotheken, die Kontext mit Bind (wie Bluebird), Fasern und so weiter bieten. –

+0

@Neuquino, die eine enge Code-Kopplung verursachen würde, würden Tests schwieriger machen, würden Sie daran hindern, Ihr Logging-Schema zu ändern (was ist, wenn Sie mehr Kontext wollen, aber nur 'req') und nicht einmal funktionieren, sobald mehrere Kontext sind benötigt gleichzeitig (über asynchronen Code). – Amit

10

einen Blick auf Fortsetzung Local Storage hat, implementiert es etwas ähnlichen Kontext für asynchrone Aufrufketten einzuzufädeln: https://github.com/othiym23/node-continuation-local-storage

Auch gibt es Bestrebungen, asynchrone lokale Speicherung als standardisierte Funktion zu bauen in Javascript selbst, aber sie sind immer noch in einem sehr frühen Stadium: TC39 Zone Vorschlag https://docs.google.com/presentation/d/1H3E2ToJ8VHgZS8eS6bRv-vg5OksObj5wv6gyzJJwOK0

+0

Dies sollte als die richtige Antwort gekennzeichnet werden. Die aktuell markierte richtige Antwort beantwortet die Frage nicht korrekt. – adam

+0

Seien Sie vorsichtig mit dieser Bibliothek, obwohl es meiner Meinung nach fehlerhaft ist. Ich habe es versucht, als ich Multitenant-App-Lösung gemacht habe und diese Bibliothek Kontexte verlor, als ich Stresstests durchführte. Ich übergab den Anfragekontext in jeder Funktion, in der ich sie benötigte. Auf den ersten Blick scheint es nicht cool, aber explizit besser als implizit meiner Meinung nach. – Alex