4

对于日志记录/调试,我想在响应发送到浏览器之前输出前一百个字符左右。我可以用中间件和响应对象做一些简单的事情吗?

理想情况下,它类似于:

app.use(function(req, res, next) {
    console.log('Response snippet: '+((res.body || '').substr(0,100)));
    next();
});

除了响应没有正文,我无法弄清楚当前要发回的正文在哪里传递。

更新:

彼得的回答奏效了,我想我会把我的中间件代码放在这里,以节省未来的观众点击:

App.use(function(req, res, next) {
    var end = res.end;
    res.end = function(chunk, encoding){
        res.end = end;
        if (chunk) {
            console.log(chunk);
        }
        res.end(chunk, encoding);
    };
    next();
});
4

1 回答 1

5

因此,您需要挂钩响应输出 API,这在中间件中并不像挂钩请求处理那么简单。最好的例子是connect 的内置记录器中间件。它基本上是猴子修补req.end方法并将数据转发到它的流,然后继续调用真正的req.end函数。您需要遵循这种模式,它应该适用于非流式响应。

该模式最终可能只会给您最后一块数据(对于流式响应的情况)。如果是这样,你只需要猴子补丁res.write而不是res.end你就可以访问第一个块。res.write一旦你记录了第一个块,只需 un-monkey-patch即可。

于 2012-12-05T05:38:24.713 回答