express响应问题(已解决)
发布于 7 年前 作者 xiaobai2017666 3897 次预览 最后一次回复是 7 年前 来自 问答
user.post('/dialog',function (req,res,next) {
res.header('Access-Control-Allow-Origin', '*');
//mongodb数据库查询
types.find(function (err,result1) {
if(err){
console.log(err);
}
//数据库文档的是否查找到的标识
let typesFindFlag=true;
let dialogsFindFlag=true;
for(let i=0,len=result1.length;i<len;i++){
let reg = new RegExp(result1[i].title);
if (reg.test(req.body.text)) {
dialogs.find({ text: 'type' }, function (err, result2) {
if (err) {
console.log(err);
}
result2[0].dialog += '<ol>';
for(let j=0,len=result1[i].list.length;j<len;j++){
result2[0].dialog += '<li><a href="#/work/' + result1[i].list[j] + '">' + result1[i].list[j]+'</a></li>';
}
result2[0].dialog += '</ol>';
//报错行
res.send(result2[0]);
})
typesFindFlag=false;
break;
}
}
if(typesFindFlag){
dialogs.find(function (err,result) {
if(err){
console.log(err);
}
for(let i=0,len=result.length;i<len;i++){
let reg=new RegExp(result[i].text);
if(reg.test(req.body.text)) {
//报错行
res.send(result[i]);
dialogsFindFlag=false;
break;
}
}
})
}
if (dialogsFindFlag) {
dialogs.find({ text: 'nothing' },function (err,result) {
if(err) {
console.log(err);
}
//报错行
res.send(result[0]);
})
}
})
})
场景是我频繁在一个时间段反复访问后出现报错 throw er; // Unhandled ‘error’ event ^
Error: Can’t set headers after they are sent. 网上查询分析后我觉得是第二次请求时,第一个请求未响应完成,然后在第二次请求时产生了两次响应。 但是不知道如何进行处理,求帮助,嘤嘤嘤
11 回复
明显是一个请求多次响应了, 对于某一个请求,11行的for循环次数大于1 里面就会响应多次造成这个错误
不要再这样写代码了, 人生要有些追求
@ouyangxuanyun 我循环里面if加了break 。 并且我的数据库控制了,if条件最多满足一次
@xiaozhongliu 请问我的代码有什么问题吗
异步编程不是你这样玩的
一眼看去就让人头疼, 这是最大的问题
@linliny 求前辈赐教
原因不是for循环的请求多次响应。 而是for循环外的第二个if分支没有遵循异步编程思想。导致res.send执行了两次。
把第二个if分支放在前者查询执行结束后就可以了
试试这样写,舒服一点
看着你的代码就知道,你不适合写nodejs,promise被狗吃了吗
来自酷炫的 CNodeMD
@linliny 好的 谢谢。