Ist es möglich, die aktuelle Anfrage zu erhalten, die von node.js geliefert wird?

7

Ich benutze express.js. Ich muss in der Lage sein, bestimmte Anfragedaten zu protokollieren, wenn jemand versucht, eine Nachricht zu protokollieren. Dazu möchte ich eine Hilfsmethode wie diese erstellen

%Vor%

Ich würde dann die Methode so verwenden.

%Vor%

Beachten Sie, dass ich das req-Objekt nicht an die log_message-Funktion übergebe. Ich möchte, dass dies transparent gemacht wird, damit der log_message-API-Benutzer die gemeinsamen Daten, die protokolliert werden, nicht kennen muss.

Gibt es eine Möglichkeit, dies mit express.js / node.js zu erreichen? Ist das Anfrageobjekt von einer globalen Variablen verfügbar?

    
Moiz Raja 25.09.2012, 03:35
quelle

5 Antworten

1

Die folgende Lösung ist für mich akzeptabel.

Hier habe ich eine Middleware, die dem Request-Objekt die Methode log_message hinzufügt. Danach rufe ich req.log_message einfach auf, um die Nachricht zu protokollieren. Das ist sehr ähnlich, wenn man das req-Objekt an jeden Logging-Aufruf weitergibt, aber es ist nur etwas sauberer.

%Vor%     
Moiz Raja 25.09.2012, 16:15
quelle
10

Eine interessante Möglichkeit wäre das neue Domänen-Feature. Ссылка

Domains können zwar eine ausgezeichnete Fehlerbehebungsfunktion bieten, können jedoch als eine Art "lokaler Thread-Speicher" verwendet werden - im Grunde genommen werden Daten für jede Anfrage gespeichert.

Erstellen Sie eine Middleware, die jede Anforderung / Antwort zu einer Domäne hinzufügt.

%Vor%

In der Protokollfunktion können Sie jetzt die aktuelle Domäne abrufen und das Anforderungsobjekt herausziehen.

%Vor%

Domains sind immer noch experimentell, aber es hört sich nicht so an, als würde sich zwischen jetzt und der Version 1.0 viel ändern.

    
The Reddest 25.09.2012 04:14
quelle
5

Ähnlich wie bei der Domain-Antwort, ist es nun wesentlich einfacher, dies mit dem Fortfahren-Local-Storage zu tun: Ссылка

Bei DataHero speichern wir eine Transaktions-ID, eine Benutzer-ID und eine Sitzungs-ID mit allen Protokollnachrichten. Sie müssen das Anforderungsobjekt nicht vollständig übergeben, damit es auch Ihre Modelle / Business-Ebene sauber hält.

    
ibash 22.05.2014 16:07
quelle
3

Erstellen Sie eine Middleware:

%Vor%

Und benutze es:

%Vor%     
Shashank Singh 16.03.2015 09:10
quelle
2

Wie ist die log_message für den Aufrufer (ein Modul usw.) verfügbar und welche Kontrolle haben Sie über die Pipeline vor der Route?

Sie könnten Middleware vor dem Aufruf dieser Route anwenden und die Funktion log_message von einer Closure kommen lassen, oder Sie könnten die Funktion req EventEmitter nutzen und den Aufruf in winston.log innerhalb eines Handlers für die req umbrechen .end und protokollieren Sie alle Nachrichten, die während der Anfrage erstellt wurden. Dies würde Ihr log_message effektiv zu einem Akkumulator von Protokollnachrichten (möglicherweise in einem Array) ändern und sie alle am Ende der Anforderung protokollieren.

Das kommt darauf an, wie Sie dieses Zeug bloßlegen.

Viele Katzen wurden hier gehäutet:)

    
SonOfNun 25.09.2012 03:43
quelle

Tags und Links