2017-05-07 5 views
1

Ich habe mehrere res.send in einer Route, wie kann ich sie alle in eins und senden Sie die angehäufte Liste am Ende? Ich ziehe es in der folgenden Form zu tun:Nodejs Express-Antwort in eine Liste anfügen

{ 
"writer": {success message}, 
"archive": {success message}, 
... 
} 

und eine andere wie oben für die Liste Fehler. hier ist der Code:

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 
      }); 
     }) 
    }); 
}); 

Antwort

2

ich Ihr Problem sind die asynchronen Aufrufe an die Datenbank übernehmen.

Also am besten nehmen Sie eine Bibliothek Ihrer Wahl (zum Beispiel async) und tun Sie Ihre asynchronen Prozesse, im Callback dann endlich senden Sie Ihr Ergebnis.

Ihr Ergebnis könnte wie folgt aussehen:

async.parallel([ 
 
    function(callback) { ... }, 
 
    function(callback) { ... } 
 
], function(err, results) { 
 
    // send your result here 
 
});

Beachten Sie, dass, wenn Sie mit .parallel der endgültigen Rückruf wird sofort aufgerufen werden, wenn eine der Versprechungen nicht. siehe die docu

Verwandte Themen