2016-06-16 8 views
0

Ich entwickle derzeit API-Server mit node.js und . Ich möchte Informationen darüber wissen, wie lange jede API zur Reaktion braucht. Dafür benutze ich response-time, um Zeit zu gewinnen.Abrufen von res.json() - Daten von derselben Knotenanwendung

app.use(responseTime(function(req, res, time) { 
    var log = { 
    "date" : new Date(), 
    "os" : req.headers['user-agent'],     
    "requestUrl" : req.originalUrl, 
    "ipAddress" : req.ip, 
    "requestMethod" : req.method, 
    "statusCode" : res.statusCode, 
    "statusMessage" : "", 
    "timeTaken" : Math.floor(time), 
    "data" : JSON.stringify(req.body) 
    }; 
    // save log data 
})); 

Für jede API-Antwort, verwende ich json Verfahren zum Fehler d.h. res.status(400).json({message: 'Something'}).

Wie kann ich diese json Fehlermeldung innerhalb responseTime Funktion reactive?

Antwort

2

Leider glaube ich nicht, dass dies mit dieser Middleware möglich ist. Die response-time Middleware stoppt Timing kurz bevor die Header gesendet werden (using onHeaders), die ich glaube, ist bevor der Textkörper auf das Antwortobjekt festgelegt ist. Ich bin mir nicht einmal sicher, ob der Körper jemals auf das Antwortobjekt gesetzt wurde.

Sie könnten versuchen, etwas wie mung, in Kombination mit `Antwortzeit?

1

Der Grund dafür, dass Sie nicht darauf zugreifen können, ist, dass der Antworttext nie auf das Antwortobjekt gesetzt wird. Stattdessen wird es direkt zum Client gestreamt. Sie müssen also den Antworttext manuell in das Antwortobjekt aufnehmen.

Die einfachste Lösung wäre, den Body (Fehler json in Ihrem Fall) immer in ein benutzerdefiniertes Feld innerhalb des Antwortobjekts zu übergeben. Zum Beispiel in Ihrer Route hinzufügen etwas wie folgt aus:

get('/myErrorRoute', function(req, res, next) { 
    var errJson = {message: 'Something'}; 
    res.myCustomField = errJson; 
    res.status(400).json(errJson); 
}); 

Dann greifen sie in Ihrer Middleware wie folgt aus:

app.use(responseTime(function(req, res, time) { 
    var log = { 
    "date" : new Date(), 
    "os" : req.headers['user-agent'],     
    "requestUrl" : req.originalUrl, 
    "ipAddress" : req.ip, 
    "requestMethod" : req.method, 
    "statusCode" : res.statusCode, 
    "statusMessage" : "", 
    "timeTaken" : Math.floor(time), 
    "data" : JSON.stringify(req.body) 
    }; 
    // acces your custom field 
    console.log(res.myCustomField); 
})); 

Oder wenn Sie wagen, Affe die json() -Methode patchen, dies zu tun . example here