2017-05-07 59 views
0

我正在使用猫鼬来读取和更新并删除一些文档。
找到并更新和删除工作正常。除了最后一个data.remove();未被删除并且出现错误。在代码的最后nodejs mongoose删除匹配错误:发送后无法设置标头

res.status(200).json({ 
       success: true 
      }); 


我在我下面的代码得到这个错误:

events.js:160 
     throw er; // Unhandled 'error' event 
    ^
    Error: Can't set headers after they are sent. 

,它指向的线。

router.post('/some/route', function (req, res) { 
    if (req.isLoggedIn()) { 
     return res.status(403).json({}); 
    } 
    MyModel.findById(req.user._id,function (err, data) { 
     if(err || data.rights !== 'super'){ 
      return res.status(403).json({}); 
     } 
     if(req.body.writer){ 
      Books.update(
       { writer : req.body.id}, 
       { $set : { writer : req.body.writer} }, 
       function (err) { 
        if(err){ 
         res.status(500).send(err); 
        } 
        else{ 
         res.status(200).send('updated successfully.'); 
        } 
       } 
      ); 
     }else{ 
      Books.remove({writer: req.body.id}, function(err){ 
       if (err){ return console.log(err)} 
      }); 
     } 

     MetaInfo.findOneAndRemove({_id: req.body.id}, function (err, data) { 
      console.log(err);    
     }); 
     Archive.findOne({_id: req.body.id},function (err, data) { 

      smtpTransporter.sendMail({...}, function (error, response) { 
       if (error) { 
        console.log(error); 
       } else { 
        console.log("Mail sent"); 
       } 
       smtpTransporter.close(); 
      }); 

      data.remove(); 
      if (err) { 
       console.log(err); 
       return res.status(200).json({ 
        success: false, 
        message: 'server error', 
        err: err 
       }); 
      } 
      res.status(200).json({ 
       success: true 
      }); 
     }) 
    }); 
}); 
+1

最可能的问题是res.status/send之一已在该语句之前执行。在每个res.status语句之前尝试和console.log,以便您可以跟踪代码已分支的语句的所有条件块。 –

回答

1

基本上,当你做res.send或res.json时,它会设置响应头。当javascript发现另一个res.send在一个之后执行时,它会引发错误,表明头文件已经设置。

确保您每次都返回res.send或json,或者您正在使用适当的if else语句。

要阐述:

例1:

app.get('/', (req, res) => { 
if(true){ 
    res.send('first'); 
} 
res.send('second'); 
}); 

这将在控制台抛出错误。

实施例2:

app.get('/', (req, res) => { 
if(true){ 
    return res.send('first'); 
} 
res.send('second'); 
}); 

无错误抛出。

实施例3:

app.get('/', (req, res) => { 
if(true){ 
    res.send('first') 
} 
else{ 
    res.send('second'); 
} 
}); 

无错误抛出。

+0

假设我在一条路线上有多个res.send,如何将它们全部追加到一个中,以便我可以将所有成功响应都融入到一个中? – cplus

+1

如果您想累积所有错误并在最后立即响应,您可以在路由功能开始时将变量“错误”初始化为空。无论何时出现错误,请将其推入该变量中。最后检查错误是否为空,如果成功或者它存在,则发送错误的json。我希望那就是你想要的。 –

+0

你可以举一个例子,在问题中使用我的上述代码吗? – cplus

相关问题