我正在使用npm-request和npm-async调用两个服务,将它们的结果组合在一起,并将它们显示给用户。 (服务1:你好;服务2:世界;服务3:你好世界)。我想通过标题传递ID来跟踪调用的路径。
helloString = 'Nothing';
worldString = 'Yet';
async.series([
function(callback){
// call helloService
request('http://localhost:3000/hello', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
callback(null, body);
}
else {
callback(err, null);
}
})
},
function(callback){
// call worldService
request('http://localhost:3001/world', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
callback(null, body);
}
else {
callback(err, null);
}
})
}
],
// optional callback
function(err, results){
// results is now equal to ['hello', 'world']
console.log('*************');
console.log(results[0] + ' ' + results[1]);
console.log('*************');
res.send(results[0] + ' ' + results[1]);
});
我想做的是截取这两个调用并添加一个自定义标题,就像我写的那样:
request({url: 'http://localhost:3000/hello', headers: {'id': '12345'}}, function (error, response, body) {...
但无需每次都手动输入。
到目前为止,我已经尝试将其放在每个服务的server.js文件中:
app.use(function(req,res,next){
if (req.headers["id"]) {
console.log('service was given id: ' + req.headers["id"]);
res.writeHead(200, {"id": req.headers["id"]});
console.log('set res header id to ' + res._headers["id"]);
}
else {
console.log("I wasn't passed the ID");
}
next();
});
我似乎正确地抓住了ID,但是无法将其传递给下一个服务。这是我得到的错误:
_http_outgoing.js:335
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
提前谢谢!
答案 0 :(得分:2)
在server.js服务文件中,更改此内容:
res.writeHead(200, {"id": req.headers["id"]});
到此:
res.setHeader("id", req.headers["id"]);
res.writeHead()
正试图写出所有标题并完成响应的标题部分。这还不是你想在中间件中做的事情。