2015-03-13 11 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