nodejs mongoose remove hits错误:发送后不能设置标头

时间:2017-05-07 10:14:55

标签: javascript node.js mongodb mongoose

我正在使用mongoose来读取和更新并删除一些文档。
查找,更新和删除工作正常。除了最后data.remove();之外没有删除并且遇到错误 我在下面的代码中收到此错误:

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

并指向它的行是:

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

在代码的末尾。

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 个答案:

答案 0 :(得分: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');
 }
});

没有抛出任何错误。