Express Async – 发送后无法设置标题,双重callback?

我有一个恼人的地狱问题与'错误:发送后无法设置标头。 在Express中。 这个代码最初使用的是Restify而不是Express,而我一直以来以这种或那种forms出现这个问题。

该代码向另一个API(已编辑)发出2个asynchronous请求,并将结果合并到单个JSON中,然后将其存储到MongoDB中。

任何洞察力将不胜感激,因为我尝试了所有我能想到的,不知道为什么相同的function将在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(); }); 

在路由callback结束时,删除:

 return next(); 

在这里你不需要它,并且在async.parallel完成之前总是执行这一行(在代码中使用collateResults )。 您很可能会在后续的路由中发送响应,然后在两次请求完成后再次发送响应。