【发布时间】:2023-03-12 10:25:01
【问题描述】:
我正在尝试调试 node.js Express 应用程序中可怕的 Can't set headers after they are sent 错误。具体来说,我使用knox 库与s3 对话。
大致来说,我有这个 Express 处理程序,使用 knox s3client 的全局实例:
function foo(req, res) {
//Region A
var s3req = global.s3client.get('foo').on('response', function(s3res){
//Region B
res.set('content-length', s3res.headers['content-length']); //This will fail
s3res.on('data', function(chunk){
res.write(chunk);
});
});
//Region C
s3req.end();
}
如果我在区域 A 的 res 上设置任何标题或状态代码,一切正常。如果我在区域 B 中尝试任何这些,我会收到“发送后无法设置标头”错误。请注意,我想在res 上设置标题,而不是s3res
大概response.writeHead 在调用 knox s3client 的响应回调之前被调用或触发。是否有一些调试标志或其他方法可以让 Node 在调用 writeHead 时/在何处吐出?节点 0.10 添加了一个response.headersSent,但是通过检查这个标志来确定它被调用的位置将非常难以填充我的代码和所有 3rd 方库。还是有其他方法可以解决这个问题?
【问题讨论】:
-
我前段时间遇到过这个。我可以建议先尝试不同版本的 express,这意味着升级或降级你的 express.js。
-
我已经尝试过 Express 3.1 和 3.2.1。我也试过节点 0.10.3 和节点 0.10.5