我有一个令人讨厌的问题是'错误:发送后无法设置标头'。在快递。这段代码最初使用的是Restify而不是Express,自从转换它以来,我一直在以这种或那种形式出现这个问题。
代码向另一个API(已编辑出来)发出2个异步请求,并将结果合并为一个JSON,然后将其存储在MongoDB中。
任何见解都会受到赞赏,因为我已经尝试了所有我能想到的,并且不知道为什么相同的功能在Restify中起作用而不是在适当的变化下运行。
请不要评论毁灭金字塔,我知道这不是理想的,但这不是重点;)
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();
});
答案 0 :(得分:1)
在路线回调结束时,请删除:
return next();
您在这里不需要它,此行将始终在async.parallel
完成之前执行(代码中为collateResults
)。您很可能在后续路线中发送响应,然后在您的两个请求完成后再次发送响应。