Node.Js/Express - 输出响应前几个字符的简单中间件

4

为了记录和调试,我想在将响应发送到浏览器之前输出前一百个字符左右的内容。是否可以通过中间件和响应对象来实现这个简单的功能呢?

理想情况下,代码如下:

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

除了响应没有正文,我无法确定当前要发送的正文传递到何处。

更新:

Peter的答案有效,我想把我的中间件代码放在这里,以保存未来的查看者不用再点击:

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();
});

你的 app.js 文件中是否有 app.use(express.bodyParser()) 这段代码?它应该在你的路由声明之前,作为 app.configure 的一部分。 - Hector Correa
没有使用bodyParser,但已经添加了它。看起来它为req提供了body,但不是为res提供。我想窥视一下我正在发送的内容。 - Aaron Silverman
我不知道Express是否内置了对此的支持。我猜想你需要在res.render()之后查看响应,但我不知道是否有任何钩子可以使用。 - Hector Correa
你可以在 res.on('data', callback) 上监听,但如果你使用了 express.compress(),那么它将是二进制的。如果这只是为了开发,你可以不启用压缩。 - Jonathan Ong
1个回答

5
所以你需要钩入响应输出 API,这在中间件中不像钩入请求处理那样直截了当。最好的例子是 connect's built-in logger middleware。它基本上对 req.end 方法进行了 monkey-patch 并将数据转发到其流中,然后继续调用真正的 req.end 函数。您需要遵循此模式,这对非流式响应应该可以正常工作。
这种模式可能最终只会给您提供最后一块数据(对于流式响应的情况)。如果是这样,您只需 monkey-patch res.write 而不是 res.end,您就可以访问第一个块。在记录第一个块后,请取消 monkey-patch res.write

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接