【发布时间】:2014-10-09 08:13:08
【问题描述】:
我在使用 nodejs 和 express 时遇到了一些非常奇怪的问题。
我的一个处理请求的函数必须从数据库中获取一些东西并将其作为 JSON 发送给客户端。
原来是这样的:
- 获取请求
- 调用数据库
- 处理数据并将其打包为 JSON
- response.json(JSON)
通常一切正常,但如果在 2 到 3 之间超时,因为它是异步的,它会自动创建响应,并且会出现错误“发送后无法设置标头”。当我打电话给 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里面有异步调用。
【问题讨论】:
-
我的猜测是,在发送响应之前,您不会先等待异步请求完成,因此您尝试向同一请求发送两次响应。贴出相关代码,我们就可以确定了。
-
我添加了代码。但正如我已经描述的那样,代码没有问题。问题在于超时,因为超时发生在异步调用的中间,然后快速设置标题并发送它。当调用完成时,我的函数尝试再次执行。我也可以单独重复这个错误。
-
我没有立即发现这里有什么问题。
handleError是做什么的?另外,为什么要设置Content-Type标头?res.json已经为你做到了 -> LINK -
我不确定 Content-Type,所以我手动添加了它。 handleError 只是用红色字母写 error.stack 没什么特别的。正如我所描述的,问题只是在 nodejs 等待 DB 并自动发送标头时触发超时。