2015-09-04 86 views
0

我使用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(); 
}); 

我似乎是正確抓住標識,但有它傳遞到下一個服務的麻煩。這是我得到的錯誤:

_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

遵循jfriend00的建議,我圍繞request()模塊構建了一個包裝來完成我想要的功能!這是一個很好的學習經歷,如果你想了解我是如何做到的,我寫了它here

2

在你server.js服務的文件,更改此:

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

這樣:

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

res.writeHead()試圖寫出所有頁眉和完成響應的頭部分。那還不是你想要在中間件中做什麼。

+0

哦,我明白了!謝謝。這照顧到了錯誤,但不幸的是,頭文件仍然沒有被輔助服務接收。這些是傳遞給helloService的頭文件(我通過req.headers獲得了這個頭文件):{host:'localhost:3000',connection:'close'} –

+0

@SamuelHill - 這是一個演示你如何使用'request )':https://github.com/request/request#custom-http-headers – jfriend00

+0

@ jfrend00謝謝!我明白了,但我需要做的是攔截該請求並添加標題,而不是爲每個調用手動添加標題。 –

相關問題