2013-09-10 51 views
18
  1. 我想以express的速度收聽傳入的POST請求。
  2. 我想管這個請求到另一臺服務器
  3. 我想收到快件處理程序內響應(我不想管反應表達資源流)

現在我有以下代碼:express req.pipe()不起作用

app.post('server1',function(req,res,next){ 
    var request = require('request'); 
    req.pipe(request.post('server2')).pipe(res); 

} 

所以這不起作用 - 請求甚至沒有管道到服務器2 - 我檢查它,並沒有傳入的請求。


我解決點1 & 2這樣的:

var bodyParser = express.bodyParser(); 

app.use(function(req,res,next){ 

    if(req.path == '/server1' && req.method == 'POST') { 
     return next(); 
    } 
    else { 
     bodyParser(req,res,next); 
    } 
}); 

不怎麼樣,但它的作品 - 它只是禁用bodyparser單個路線(POST /服務器1)。

但我仍然不知道如何從管道請求獲得JSON響應體 - 我有下面的代碼:

app.post('/server1',function(req,res,next){ 

    var request = require('request'); 
    var pipe = req.pipe(request.post('/server2')); 

    pipe.on('end',function(){ 

     var res2 = pipe.response; 
     console.log(res2); 

    }); 
}); 

res2對象有正確的StatusCode和標題等,但不包含機身 - 我怎麼能從res2這個對象中得到這個? /server2返回JSON的一些數據,但我不知道如何從響應讀它...

+11

這可能意味着'req'已經被讀到完成 - 它的[''end''](http://nodejs.org/api/stream.html#stream_event_end) - 可能通過'bodyParser ()'。在那之後,一個流不會重新啓動一個新的'.pipe()'。 –

+0

那麼如何讓它不被讀取完成?或者我如何從已經讀取的請求中創建一個流?我需要管道請求,因爲有文件上傳那裏... – user606521

+0

我編輯我的問題 - 你對'bodyParser'的評論幫了我很多 - 我只需要解決最後一點(3)。 – user606521

回答

14

它不工作,因爲bodyParser攔截所有與解析器

+2

這是我的問題!謝謝! – Stasel

+0

你先生,救了我的屁股:P謝謝;) –

4

我覺得你幾乎沒有屍體。你應該聽上的管data事件收集響應:

app.post('/server1',function(req,res,next) { 
    var request = require('request'); 
    var pipe  = req.pipe(request.post('/server2')); 
    var response = []; 

    pipe.on('data',function(chunk) { 
    response.push(chunk); 
    }); 

    pipe.on('end',function() { 
    var res2 = Buffer.concat(response); 
    console.log(res2); 
    // don't forget to end the 'res' response after this! 
    ... 
    }); 
}); 

然而,由於你解決了「bodyParser()獲得的方式」的問題,你也可以用你的原始管的設置,如果你只是想返回server2生成的響應(同時,請確保在使用request時使用正確的URL)。

相關問題