2017-05-07 4 views
0

私はmongooseを使用していくつかの文書を読み取り、更新して削除しています。
検索と更新と削除が正常に動作しています。最後のdata.remove();は削除されず、エラーになります。
私は以下の私のコードでこのエラーを取得しています:nodejs mongooseヒットを削除するエラー:送信後にヘッダーを設定できない

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

最も可能性の高い問題は、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

私は1つのルートで複数のres.sendを持っていて、どのようにして1つにすべての応答を得ることができるように、それらをすべて1つに追加できますか? – cplus

+1

すべてのエラーを累積して最後に一度に応答する場合は、ルート機能の開始時に変数 'errors'をnullとして初期化できます。エラーが発生するたびに、その変数にプッシュします。最後に、エラーがヌルかどうかを確認します。成功した場合、または存在する場合は、エラーjsonを送信します。私はあなたが探しているものを願っています。 –

+0

上記のコードを使ってあなたの例を与えることができますか? – cplus

関連する問題