2017-05-07 60 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

相關問題