Node.js express,timeout“发送后不能设置标题。”
问题描述:
我有一些真正奇怪的nodejs和express问题。Node.js express,timeout“发送后不能设置标题。”
我处理请求的函数之一,必须从DB获取某些内容并将其作为JSON发送给客户端。
所以是这样的:
- Get请求
- 呼叫DB
- 处理数据,并将其打包成JSON
- response.json(JSON)
通常它会一切正常,但如果在2和3之间有超时,因为它是异步的,它会自动创建响应,并且会出现错误“无法设置h发送之后的读者。“当我打电话4
有没有其他人有这个问题?有没有正常的方式来处理它,或者我只需要检查response._header是否已经设置好了?
exports.appstimebygroup = function (req, res) {
var resp = {};
var clientId = Webapi.extractClientId(req);
AppTime.getByGroupId(clientId, req.body.groupId, function(error, appstime){
if (error) {
handleError(error);
resp.returnCode = 0;
resp.message = "Some error have happened, please contact support!";
res.setHeader("Content-Type", "application/json");
res.json(resp);
return;
}
resp.returnCode = 1;
resp.appstime = appstime;
if(res._header){
console.log("header allready set!");
return;
}
res.setHeader("Content-Type", "application/json");
res.json(resp);
});
};
而AppTime.getByGroupId在里面有异步调用。
答
好的,问题是多部分形式的数据处理超时。
当发生这种情况时,它会调用next(err)。
form.on('error', function(err){
if (!options.defer) {
err.status = 400;
next(err);
}
done = true;
});
默认情况下误差会做res.send(400),当正常获取到代码,你想执行有问题。
我的猜测是,在发送响应之前,您并未等待异步请求先完成,因此您正在尝试向相同的请求发送两次响应。发布相关代码,我们可以肯定知道。 – mscdex 2014-10-08 18:09:11
我添加了代码。但正如我已经描述的那样,代码中没有问题。问题在于超时,因为超时发生在异步调用的中间,然后表达集头并发送它。当通话结束时,我的功能再次尝试。我也可以单独重复这个错误。 – 2014-10-08 19:41:53
我不会立即在这里看到任何错误。 'handleError'做了什么?另外,你为什么要设置“Content-Type”标题? 'res.json'已经为你做了这个 - > [链接](https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias 2014-10-08 21:11:44