Wie zu erkennen, Anfrage (per ID) durch middleware-Kette im Express.
Ich bin die Entwicklung einer RESTful server in node.js mit Express als Rahmen, und Winston, für den moment, als-logger-Modul.
Dieser server verarbeitet eine große Menge an gleichzeitigen Wunsch, und es wäre sehr nützlich, um mich verfolgen zu können, die log-Einträge für jede spezifische Anforderung, mit so etwas wie einer "Anforderungs-ID". Die straight-Lösung ist einfach zu fügen Sie diese ID als ein weiteres Stück der logging-Informationen zu jeder Zeit, ich will einen log-Eintrag, aber es bedeutet übergeben die "Anforderungs-ID" für jede Methode, die vom server verwendet.
Ich würde gerne wissen, ob es irgendein Knoten.js/javascript-Modul oder eine Technik, die mir erlauben würde zu tun, diese in einen einfacheren Weg, ohne das tragen um die request-ID, die für jede spezifische Anforderung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
req
Objekt, die kommt mit jeder Anforderung im express.Also die erste route, die Sie tun würde, in Ihrer Anwendung wäre:
Und dann irgendwo in express, Sie können den Zugang, die
id
imreq
Objekt:req.log.id
;Sie noch brauchen, um einige Daten in Funktionen, die tun möchten, erstellen Sie einige logs. In der Tat haben Sie vielleicht logging-Funktion innerhalb
req.log
Objekt, so dass die Art und Weise es wird garantiert, dass die Protokollierung wird nur geschehen, wenn es Zugang zureq.log
Objekt.Wenn Sie auto-Inkrement, für Ihre spätere log-analytics werden nicht in der Lage, um eindeutig zu identifizieren Anfragen, da verschiedene Instanzen erzeugen der Kollision-IDs und Neustart der app wird automatisch bewirken, dass ID-Kollisionen.
Hier ist eine andere mögliche Lösung.
Installieren cuid:
Dann in Ihre Haupt-app-Datei:
Jetzt bekommen Sie eine freundliche Anfrage-ID, die wahrscheinlich zu kollidieren, und Sie werden in der Lage sein, um Sie eindeutig zu identifizieren, Ihre Wünsche für Ihre log-analytics und-debugging, auch über mehrere Instanzen und server neu gestartet.
Ich Schwierigkeiten hatte die Suche nach einer Lösung für dieses problem.
Die Sache, die ich mochte es nicht, über Lösungen, die hier vorgeschlagen wurde, dass Sie implizieren teilen der req-Objekt unter alle Funktionen, die zusammen das Projekt.
Ich fand eine Lösung, mischen Sie Ihre Vorgehensweise (Erstellung einer uuid pro Anfrage) und mit einer Bibliothek (Fortsetzung-local-storage), ermöglicht das "teilen" - namespaces unter Module.
Finden Sie die Erklärung in dieser anderen Antwort: https://stackoverflow.com/a/47261545/5710581
Wenn Sie möchten mehr info, ich schrieb all diese Ideen und alle den code in einen post, um zu erklären, alles an einem Ort:
Express.js: Protokollierung info mit global eindeutigen Anfrage-ID – Node.js
Sollten Sie sich nicht mit Globalen Variablen.
Was ich mag zu tun ist, um das füllen eines META-Objekt vor jeder Anfrage.
Verwende ich eine UUID-generator (https://github.com/kelektiv/node-uuid) ID eine Anfrage
Hier ist ein Beispiel
Wie erwähnt von @moka , Über die request-ID in jeder Anfrage ist der Knackpunkt, das problem zu lösen. Einen anderen Weg der Abstraktion, all dies wird durch die Verwendung von http-Kontext und uuid
So festlegen einer UUID in der httpContext, bevor alle middlewares (als Anwendung, middleware und nicht als router middlware). jetzt können Sie die uuid überall in Ihrem code, und melden Sie es.
Hier ist eine Beispiel-Implementierung, die ich verwendet habe
Erhalten Sie die komplette Referenz gibt es hier uuid in der Anfrage
Nun habe ich die reqId set hier in meinem custom pino logger'
Wenn die reqId null ist, bedeutet es, dass die Logger wurden eingefügt in den code, der verwendet wird, bevor Sie die express-App. Hoffe Sie können diese verwenden, als eine Alternative Lösung