2015-03-13 12 views
4

我想送的formData,從圖像流我開始使用request消防GET請求,並得到節點流

的問題是,該請求是formData請求後起火。 有沒有什麼辦法可以讓圖像請求識別?但是可以自由地將參數添加到formData

如:

var req = request({ 
    method: 'POST', 
    url: 'http://www.foo.bar/api/v1/tag/recognize', 
    formData: { 
    image_file: request('http://visual-recognition-demo.mybluemix.net/images/horses.jpg'), 
    param2: 'value2' 
    }, 
    json: true, 
}); 

如何火:

request('http://visual-recognition-demo.mybluemix.net/images/horses.jpg') 這樣的反應可以在req使用

UPDATE:好像Content-Length頭在
失蹤 http://visual-recognition-demo.mybluemix.net/images/horses.jpg迴應
,你只能得到Transfer-Encoding: chunked

更多細節here

+0

我不知道的是,'request'庫將允許您通過這個管道,而是你得到的也使用原始請求返回的正文進行回調。 – 2015-03-13 19:55:11

+0

我認爲這應該在請求庫中處理。如果在第一個響應中未指定「content-length」,則會發生 – 2015-03-31 14:46:44

回答

3

取文檔的外觀this part。什麼你所描述的實際上是這個塊

request.get('http://google.com/img.png').pipe(request.put('some_url')); 

注意文檔

在這樣做時,內容類型和內容長度在 PUT頭被保留。

另請注意,如果您未指定回調,請求將始終返回流。如果您確實提供回調,它會嘗試將響應轉換爲字符串。使用encoding:null使其返回原始字節。
示例 -

request({ 
    url: 'some_url', //your image 
    encoding: null //returns resp.body as bytes 
}, callback..) 

要調用鏈在一起(運行一前一後),您可以嵌套回調或使用的承諾。例如,在另一個請求完成後運行請求 -

var request = require('request'); 

//1st 
request('first_url', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 

     //2nd 
     request('other_url', function (error, response, body) { 
     //process resp 
     }); 
    } 
}); 

甚至更​​好,將請求回調代碼轉換爲Promises。 See a promise library like Bluebird關於如何做到這一點。

下面是與藍鳥爲例(使用然後在迭代FASION工作)

var Promise = require("bluebird"); 
Promise.promisifyAll(require("request")); 

request.getAsync('some_url').then(function(resp) { 
    request.getAsync('some_other_url').then(..processing code..); 
}); 
+0

感謝您的示例和解釋。如果您看[視覺識別](https://github.com/watson-developer-cloud/nodejs-wrapper/blob/master/services/visual_recognition/v1.js#L67)服務實施。您如何看待我可以實施您的解決方案? 我想隱藏用戶鏈接調用的問題。他們應該使用我用於這個問題的片段。 – 2015-03-31 19:20:04

+0

如果您希望用戶能夠從ajax請求(比如請求庫或其他)中獲取二進制對象,那麼您需要對實際的實現邏輯進行重構,以瞭解如何使用params。您還應該(我的建議)在文檔中明確地使用資源管道。只是看看你的庫,我永遠不會希望能夠使用異步響應作爲參數(不管它是否是原始字節) – 2015-03-31 19:26:08

+0

基本上我只是提供了一個答案,如何鏈接一個承諾(使用字節或文本響應),所以你可以實現自己。上面的答案解釋了使用請求庫的過程。但理想情況下,我認爲你不會允許將響應作爲參數輸入;或者如果你這樣做,更新文檔非常清楚地顯示該選項。 – 2015-03-31 19:28:39