【发布时间】:2018-12-22 00:35:22
【问题描述】:
我目前正在尝试使用这样的简单中间件函数记录每个 Express 请求的完整结束响应:
module.exports = (req, res, next) => {
const startTime = new Date();
const oldEnd = res.end;
res.end = (chunks, encoding) => {
const responseTime = new Date() - startTime;
res.set('Server-Timing', `total;dur=${responseTime}`);
console.log(req.path, `Response Time: ${responseTime}`);
res.end = oldEnd;
res.end(chunks, encoding);
};
next();
}
此代码适用于普通 Express 端点,但是当我尝试提供这样的静态文件时:app.use('/static/path', express.static('path')) 我收到以下错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
这是因为res.set 用于服务器计时,但这意味着express.static 使用.end() 两次?当我在中间件函数中console.log 时,它只会被调用一次。
我正在使用 NodeJS 10 和 Express 4.16.4
有人知道如何解决这个问题吗?
【问题讨论】:
-
你想达到什么目的?请详细说明“试图记录完整的结束响应”?您是否尝试测量每个请求的经过时间?
-
我正在尝试从请求和响应对象中记录一些参数,例如:状态、标头和总响应时间。这工作正常,但在使用
express.static时不起作用。因此,我覆盖了res.end函数,并在完成后再次调用它。设置响应标头会导致此问题,而它显然是在res.end之前设置的。