2016-01-15 62 views
1

我有一個惱人的地獄問題'錯誤:發送後無法設置標題。'在Express中。這個代碼最初使用Restify而不是Express,我一直在以某種形式出現這個問題,因爲它將其轉換。Express異步 - 發送後無法設置標題,雙重回調?

該代碼向另一個API(編輯出)提出2個異步請求,並將結果合併到單個JSON中,然後將其存儲到MongoDB中。

任何洞察力將不勝感激,因爲我已經嘗試了所有我能想到的,不知道爲什麼相同的功能可以在Restify中工作,而不是Express在適當的更改。

請不要在末日的金字塔評論,我知道這不是理想的,但在這裏,這不是重點;)

app.post('/rest/test', jsonParser, /*keycloak.protect(),*/ function (req, res, next) { 
var requestObj = req.body; 

try { 
    /* run async requests in parallel */ 
    async.parallel([ 
     function asyncReqV3(callback) { 
      request.post(reqUrl1, option_v3, function(err, response, body) { 
       if(err) { 
        console.log(err); 
        callback(true);  
        return; 
       } else { 
        callback(false, body); 
       } 
      }); 
     }, 
     /* v4 async request */ 
     function asyncReqV4(callback) { 
      request.post(reqUrl2, option_v4, function(err, response, body) { 
       if(err) { 
        console.log(err); 
        callback(true); 
        return; 
       } else { 
        callback(false, body); 
       } 
      }); 
     }, 
    ], 
    /* Collate results and send */ 
    function collateResults(err, results) { 
     if(err) { 
      console.log(err); 
      return res.status(500).send("Server Error"); 
     } else { 
      /* Merging results */ 
      var hash = new Map(); 
      results[0].body.krResult.forEach(function(obj) { 
       hash.set(obj.word, obj); 
      }); 
      var final = results[1].body.data.map(function(obj) { 
       return Object.assign(hash.get(obj.word) || {}, obj); 
      }); 

      var final_results = final.slice(0, 250).map(function(obj) { 
       return { 
        thing1: obj.something, 
        thing2: obj.somethingElse 
       } 
      }); 

      /* Store results in DB */ 
      db.results.insert({ 
       request: requestObj, 
       response: final_results 
      }); 

      res.status(200).send(final_results); 
     } 
    }); 
} 
catch(e) { 
    console.log(e); 
    res.status(500).send({}); 
} 

return next(); 
}); 

回答

1

在你的路線回調結束,刪除:

return next(); 

您不需要它,並且在完成async.parallel(代碼中的collateResults)之前,此行將始終執行。您很可能會在後續路由中發送響應,然後在完成兩個請求後再次發送響應。

+0

這確實可以解決問題。奇怪的是,我在之前的幾個點做過這樣的事情,並且遇到了像服務器空回覆這樣的問題,但今天沒有這樣的問題。必須改變別的東西。非常感謝! – Nodal

+1

當然,很高興提供幫助 – cviejo

相關問題