我想保存服务器提供的4XX和5XX错误。我采用的方法是创建一个快速中间件来获取statusCode响应
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);
};
我正在使用上面的代码,但我总是收到200
状态代码,即使我在我的路线上硬编码res.status(401).end()
。
答案 0 :(得分:1)
您的答案可以找到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,钩子不是透明的。它需要一些特殊的"特殊的"案例。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);
...
});
关于custom error
HttpError
您可以阅读 here
答案 1 :(得分:0)
我找到了一个名为on-finished的软件包来管理这个软件包,同时添加了一个监听器。可以这样使用:
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);
};
答案 2 :(得分:0)
您的逻辑是正确的,您只需在获取状态之前调用next
,以便其他中间件/您的路由可以设置状态代码:
const fooMiddleware = (req, res, next) => {
req.stats.totalRequestsServed += 1;
next();
console.log('status code', res.statusCode);
};