通过链式服务传递标头

时间:2015-09-04 15:50:09

标签: javascript node.js service

我正在使用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.

提前谢谢!

1 个答案:

答案 0 :(得分:2)

在server.js服务文件中,更改此内容:

res.writeHead(200, {"id": req.headers["id"]});

到此:

res.setHeader("id", req.headers["id"]);

res.writeHead()正试图写出所有标题并完成响应的标题部分。这还不是你想在中间件中做的事情。