2017-12-22 3 views
0

Ich bin vor Problem aufgrund des Fehlers dhFehler: nicht Header gesetzt, nachdem sie sent.At ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js: 356: 11) sind

Can't set headers after they are sent

Eigentlich bin ich so auf meine MongoDB abzufragen.

Test.aggregate([ 
       {$match: {'ownerid': req.body.ownerid}}, 
       {$unwind: '$groupname'}, 
       {$project: {_id:1, groupname :"$groupname",}} 
      ], function(error, data){ 
       if(error) { 
        console.log(error); 
       } else { 
        //It will return Two group id. 
        for(var i=0; i<data.length; i++){ 

         //These are the variables for my custom function which can update my query on another table 
         var primaryfilter = {'userid': req.body.ownerid}; 
         var secondaryfilter = { "groupowned" : { 'groupid': data[i]._id, 'groupname': data[i].groupname } }; 
         var activityname = 'Group Owned'; 
         updater(req, res, Test1, primaryfilter, secondaryfilter, activityname); 
        } 
       } 
      }); 

Dies ist meine Aktualisierungsfunktion:

var updater = function(req, res, CollectionName, primaryfilter, secondaryfilter, activityname){ 
    CollectionName.update(primaryfilter, {$push: secondaryfilter}, function(error2, result){ 
     if (error2) { 
      res.send({"error":"true", "status":"500", "message":"Oops! Some error occurred while updating the "+activityname+" on Post"}); 
     } else { 
      res.send({"error":"false", "status":"201", "message":"Successfully Updated "+activityname+" on Post"}); 
     } 
    }); 

}; 

Eigentlich mag ich Gruppe, von der Testsammlung holen und aktualisieren all diesen Ids auf meiner sekundären Tabelle dh Test1 Ich weiß, dass dieser Fehler generiert Due schleifen. Jeder schlägt mir vor, wie ich das lösen kann. Jede Hilfe wird geschätzt

+0

warum rufen Sie res.send nicht nach der for-Schleife ?? – sidgate

+0

Weil ich einen Eintrag einzeln updaten muss –

Antwort

2

Der Fehler, den Sie sehen, wird verursacht, wenn Sie versuchen, mehr als eine Antwort für eine bestimmte Anfrage zu senden.

Sie rufen res.send() von mit in updater(). Und Sie rufen updater() von innerhalb einer for Schleife, was bedeutet, dass Sie es mehrmals aufrufen.

So rufen Sie am Ende mehr als einmal auf dieselbe Anfrage res.send(). Das verursacht den Fehler, den Sie sehen. Sie können res.send() nur einmal pro Anfrage anrufen.

Wahrscheinlich müssen Sie die Ergebnisse aller Ihrer .update() Anrufe ansammeln und dann eine Antwort senden, wenn sie alle fertig sind. Aber Sie müssen entscheiden, was Sie wollen, dass das Verhalten ist. Welche Art von Antwort möchten Sie senden? Eine Reihe von Objekten wie diese?

{"error":"false", "status":"201", "message":"Successfully Updated "+activityname+" on Post"} 

Oder etwas anderes? Und was soll die Antwort sein, wenn eine Ihrer Anfragen einen Fehler bekommt?

Da dies mongodb ist, werden Sie wahrscheinlich die in mongodb integrierten Versprechen mit Promise.all() verwenden möchten, um zu wissen, wann alle .update()-Aufrufe erledigt sind.

Hier ist eine Möglichkeit, es zu nähern:

Test.aggregate([ 
    {$match: {'ownerid': req.body.ownerid}}, 
    {$unwind: '$groupname'}, 
    {$project: {_id:1, groupname :"$groupname",}} 
], function(error, data){ 
    if(error) { 
     console.log(error); 
    } else { 
     //It will return Two group id. 
     let promises = []; 
     for(var i=0; i<data.length; i++){ 

      //These are the variables for my custom function which can update my query on another table 
      var primaryfilter = {'userid': req.body.ownerid}; 
      var secondaryfilter = { "groupowned" : { 'groupid': data[i]._id, 'groupname': data[i].groupname } }; 
      var activityname = 'Group Owned'; 
      promises.push(updater(Test1, primaryfilter, secondaryfilter, activityname)); 
     } 
     Promise.all(promises).then(function(results) { 
      res.json(results); 
     }).catch(err => { 
      console.log(err); 
      res.sendStatus(500); 
     }) 
    } 
}); 


function updater(CollectionName, primaryfilter, secondaryfilter, activityname){ 
    return CollectionName.update(primaryfilter, {$push: secondaryfilter}).then(function(result) { 
     return {"error":"false", "status":"201", "message":"Successfully Updated "+activityname+" on Post"}; 
    }).catch(function(err) { 
     return {"error":"true", "status":"500", "message":"Oops! Some error occurred while updating the "+activityname+" on Post"}; 
    }); 
}; 
+0

Vielen Dank Bruder –

0

Der Fehler, den Sie sehen, wird verursacht, wenn Sie versuchen, mehr als eine Antwort auf eine bestimmte Anfrage zu senden. Versuchen Sie diesen Code:

const async = require('async'); // async node module : npm install --save async 

     Test.aggregate([ 
      {$match: {'ownerid': req.body.ownerid}}, 
      {$unwind: '$groupname'}, 
      {$project: {_id:1, groupname :"$groupname"}} 
     ], function(error, data){ 
      if(error) { 
       console.log(error); 
      } else { 
       //Use async module instead of simple javascript loop 
       var primaryfilter = {'userid': req.body.ownerid}; 
       var activityname = 'Group Owned'; 
       async.eachSeries(data, function(dataItem, asyncCallback){ 

        var secondaryfilter = { "groupowned" : { 'groupid': dataItem._id, 'groupname': dataItem.groupname } }; 

        Test1.update(primaryfilter, {$push: secondaryfilter}, function(error, result){ 
         if (error) { 
          asyncCallback(error); 
         } else { 
          asyncCallback(); 
         } 
        }); 

       }, function(err){ 
        if(err) { 
         return res.send({"error":"true", "status":"500", "message":"Oops! Some error occurred while updating the "+activityname+" on Post"}); 
        } 
        return res.send({"error":"false", "status":"201", "message":"Successfully Updated "+activityname+" on Post"}); 
       }); 
      } 
     }); 
+0

Wirklich schätzen Sie Herr Krishan Kant Sharma für Ihre Unterstützung –

Verwandte Themen