Javascript 如何从setTimeout callback-express发送http响应

Javascript 如何从setTimeout callback-express发送http响应,javascript,node.js,express,Javascript,Node.js,Express,我希望自定义响应超时,以便在处理时间超过一定间隔时,尝试从setTimeout回调发送响应 在下面的示例中,我将20ms设置为必须处理services.getReport()的超时时间,否则API必须以response\u timed\u out的形式发送响应 下面的代码工作正常,但会引发类似以下的异常 发送到客户端后无法设置标头 router.post(“/getReport)”,(请求、回复)=>{ 设置超时(()=>{ res.send({状态:503,消息:“响应超时”}); }, 20

我希望自定义响应超时,以便在处理时间超过一定间隔时,尝试从
setTimeout
回调发送响应

在下面的示例中,我将20ms设置为必须处理
services.getReport()
的超时时间,否则API必须以
response\u timed\u out
的形式发送响应

下面的代码工作正常,但会引发类似以下的异常

发送到客户端后无法设置标头

router.post(“/getReport)”,(请求、回复)=>{
设置超时(()=>{
res.send({状态:503,消息:“响应超时”});
}, 20);
服务。获取报告(req、res);
});
您可以使用请求对象上的方法定义每个路由的超时时间

router.post("/getReport", (req, res) => {
  req.setTimeout(2000);
  services.getReport(req, res);
});
还可以全局定义服务器上所有路由的超时时间

const server = app.listen(port, () => {});
server.setTimeout(15000);
您还可以提供第二个参数,即发生超时时将运行的回调。如果需要回调,则对响应调用
setTimeout

router.post("/getReport", (req, res) => {
  res.setTimeout(2000, () => res.send('timed_out'));
  services.getReport(req, res);
});

services.getReport是调用res.writeHead(…)还是调用res.send?在发送到客户端后,请检查此帖子中的“无法设置”标题。如果(res.headersSent){return;},您可以使用
if(res.headersSent)
,或者清除超时。这看起来不错。是否可以在
services.getReport
函数中读取值
req.setTimeout
,在本例中为
2000
,以便我可以检查(req.timeout>=2000)res.send('timed_out')是否如下
更新后的一个错误为
net::ERR\u EMPTY\u RESPONSE
@Prem如果您在请求时调用它,似乎不会调用回调,但如果您在响应时调用它,则应该可以使用。更新后的一个可以正常工作。我添加的唯一附加内容是
if(!res.headersSent){res.send(report)}
services.getReport
functionIts
中!res.headersSent
。我已经在我的评论中更新了同样的内容。非常感谢。