2016-07-29 7 views
1

Ich möchte die Anzahl der 4XX- und 5XX-Fehler speichern, die von meinem Server bereitgestellt werden. Der Ansatz, den ich nahm eine ausdrückliche Middleware zu erstellen, um den status Antwort Zugriff auf den Antwortcode, der an den Client einer Expressjs-App gesendet wird

const fooMiddleware = (req, res, next) => { 
    req.stats.totalRequestsServed += 1; 

    // I want to access the status code sent to the client here 
    console.log('status code', res.statusCode); 
    next(null); 
}; 

Ich verwende den Code oben

zu bekommen, aber ich bin immer einen 200 Statuscode bekommen, auch wenn ich ein res.status(401).end() auf meiner Route hard .

Antwort

1

Ihre Antwort kann here

app.use(function (req, res, next) { 
    function afterResponse() { 
     res.removeListener('finish', afterResponse); 
     res.removeListener('close', afterResponse); 

     // do smth after res.send 
     console.log(res.status); 
    } 

    res.on('finish', afterResponse); 
    res.on('close', afterResponse); 

    // do smth before request eventually calling `next()` 
    next(); 
}); 

Imho gefunden werden, ist Haken nicht Transparenz. Es ist notwendig für einige "spezielle" Fälle.
Fehlerhandler ist besser für die Protokollierung 4xx und 5xx Fehler.

app.get('/smth', function(req, res, next){ 
    if (!smth-check) 
     return next(new HttpError(401, 'Error-text')); // it's custom error class 
    ... 
}) 

app.use(function(err, req, res, next)) { 
    if (err instance of HttpError) 
     console.log(err.status); 
    ... 
}); 

Über custom error als HttpError können Sie here

+0

Das Problem mit dem zweiten Ansatz ist, dass wir nicht immer als nächstes verwenden. Und ich mag eine eigenständige Lösung. –

0

Ich lese ein Paket on-finished, die auch verwalten genannt fanden diese einen Listener hinzufügen. Es könnte die Verwendung so aussehen:

const onFinished = require('on-finished'); 

const middleware = (req, res, next) => { 

    onFinished(res, (err, res) => { 
    // do smth after res.send 
    }); 

    // do smth before request eventually calling `next()` 
    next(null); 
}; 
0

Ihre Logik war richtig, Sie müssen nur nextvor rufen Sie den Status bekommen, so dass andere Middle/Ihre Route können den Statuscode gesetzt:

const fooMiddleware = (req, res, next) => { 
    req.stats.totalRequestsServed += 1; 
    next(); 
    console.log('status code', res.statusCode); 
}; 
Verwandte Themen