2017-12-18 1 views
2

Ich versuche, die IDsFromMongo zu bekommen, die ich in meiner neo4j Datenbank gespeichert habe und suche nach diesen IDs im mongodb, um die Objekte zurückzugeben, die ich will. Es funktioniert 1 Mal, aber dann stürzt mein Server ab und es gibt den Fehler zurück Kann Header nicht festlegen, nachdem sie gesendet werden.kann Header nicht setzen, nachdem sie gesetzt sind

Das ist mein Code :.

routes.get('/advertisements/recommended/:brand', function(req, res) { 
    res.contentType('application/json'); 

    var brandFromUrl = req.params.brand; 
    var advertisementIds = []; 

    Advertisement.find({'car.brand': brandFromUrl}) 
    .then(function (ads) { 
     // res.status(200).json(ads); 
     ads.forEach(function (record) { 
     console.log('ids: ' + record._id) 
     session 
      .run("MERGE(a:Advertisement {idFromMongo: {idParam}, brand: {brandParam}}) WITH a MATCH(b: Advertisement {brand: {brandParam}}) MERGE(a)-[:SHARED_BRAND]->(b)", {idParam: record._id.toString(), brandParam: brandFromUrl}) 
      .then(function(result) { 
      session 
       .run("MATCH (n:Advertisement{brand: {brandParam}}) RETURN (n)", {brandParam: brandFromUrl}) 
       .then(function(result) { 
       result.records.forEach(function(record){ 
        advertisementIds.push(record._fields[0].properties.idFromMongo); 
       }); 
       Advertisement.find({ 
        '_id': { $in: advertisementIds} 
       }, function(err, docs){ 
        res.status(200).json(docs); 
       }) 
      }) 
     }) 
     }); 
    }) 
    .catch((error) => { 
     res.status(400).json(error); 
    }); 
}); 

Das ist mein Fehler:

Error: Can't set headers after they are sent. 
    at validateHeader (_http_outgoing.js:494:11) 
    at ServerResponse.setHeader (_http_outgoing.js:501:3) 
    at ServerResponse.header (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:767:10) 
    at ServerResponse.send (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:170:12) 
    at ServerResponse.json (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:267:15) 
    at c:\dev\individueel-project\individueel-database\api\advertisement.routes.v1.js:70:35 
    at model.Query.<anonymous> (c:\dev\individueel-project\individueel-database\node_modules\mongoose\lib\model.js:4046:16) 
    at c:\dev\individueel-project\individueel-database\node_modules\kareem\index.js:273:21 
    at c:\dev\individueel-project\individueel-database\node_modules\kareem\index.js:131:16 
    at _combinedTickCallback (internal/process/next_tick.js:131:7) 
    at process._tickCallback (internal/process/next_tick.js:180:9) 
+0

Sie können die Antwort nur einmal pro Anfrage senden. Aber in Ihrem Code senden Sie mehrere Antworten innerhalb von Anweisungen – ZeroCho

Antwort

0

Das Problem hierbei ist, dass Sie ein Array ausgeführt werden und in das Array Sie die Antwort senden. So wird es schließlich die Responde mehrmals senden, aber nur das erste Mal wird funktionieren, danach wird es einen Fehler auslösen. Um es zu lösen, sollten Sie die Anfrage beantworten, nachdem alle Versprechungen in Array abgeschlossen wurden (Promise.all) oder wenn Sie nicht warten müssen, bis das gesamte Array beendet ist, überprüfen Sie, ob Sie bereits geantwortet haben und nicht tun es wieder.

Verwandte Themen