2015-10-20 84 views
0

根據該鏈接:request - Node節點請求模塊Http.IncomingMessage不發射事件

的回調參數得到3個參數:

錯誤適用(通常從http.ClientRequest對象)一種 HTTP時.IncomingMessage對象第三是響應主體(字符串或 緩衝液,或者如果JSON選項被提供JSON對象)

代碼:

var r = require("request"); 

var options= { 
    url: "http://www.example.com/" 
}; 

var callback = function (err, res, body) { 
    if (!err && res.statusCode == 200) { 
     res.on("data", function(chunk) { 
      console.log("DATA : "+chunk); 
     }); 
     res.on("finish", function() { 
      console.log("FINISHED"); 
     }); 
     console.log(body); 
    } 
}; 

r(options, callback); 

但在上面的代碼中,只有console.log(body)工作,事件發射器不。

此外,如果只有在整體響應是body的情況下才會調用回調函數,那麼當我無法對其進行流式處理時,將第二個參數設置爲http.IncomingMessage(可讀流)有什麼意義。

+0

你期望得到什麼數據?如果它只是從URL返回的HTML,那是'body'? – adeneo

+0

我知道這是在身體。那麼爲什麼第二個參數是'http.IncomingMessage',其中'data'和'finish'事件沒有任何用處。爲什麼它不只是一個帶響應參數的普通對象? –

回答

1

當你通過這樣的回調時,request爲你緩衝整個回覆,這就是body中的可用回覆。因此,這意味着您將不會在res上看到data和此類事件,因爲他們已被request照顧。

+0

我只是認爲,因爲它是一個Http.IncomingMessage類型的對象,那麼它可能有這些事件。我想不出有什麼其他的理由來使它成爲這種類型。 –

+0

響應對象被傳入,因爲它包含諸如'statusCode','headers'等的內容,這些內容除了響應主體外還是有用的信息。傳遞原始響應對象比將複製的選擇屬性複製到新對象更簡單/更高效。 – mscdex

0

看起來你正在混合兩種不同的方式來使用'request'模塊。根據偏好,您可以使用回調方法或流式方法。

回調方法包括傳遞一個函數以及選項,當所有數據都被接收到時,它會調用回調函數。

流式方法允許您將偵聽器附加到「響應」等事件。我猜你已經從接收http請求和發送響應到節點服務器的例子中混合了這些代碼,因爲我無法在請求模塊的文檔中看到對'data'和'finish'事件的任何引用。

+0

是的,在文檔中沒有提及。我只是認爲,因爲它是一個'Http.IncomingMessage'類型的對象,那麼它可能有這些事件。我沒有想到有任何其他的理由使它成爲這種類型。 –

+0

作爲一個猜測,如果你使用了流式處理方法,他們會返回相同的對象,即完成'r(options).on('data',// etc' – piemonkey