触发GET请求并获取节点Stream

时间:2015-03-13 19:49:39

标签: node.js node-request

我正在尝试以formData的形式发送来自我使用request的图片的流

问题是请求在formData请求后触发。 有什么方法可以管理图像请求识别吗?但是可以自由地向formData添加参数吗?

e.g:

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

中使用

更新:似乎中间缺少Content-Length标题 http://visual-recognition-demo.mybluemix.net/images/horses.jpg回复
你只得到Transfer-Encoding: chunked

更多详情here

1 个答案:

答案 0 :(得分:3)

查看文档this part。您所描述的内容基本上就是这个块

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

请注意文档

  

执行此操作时,内容类型和内容长度将保留在   PUT标头。

另请注意,如果您未指定回调,请求将始终返回流。如果确实提供了回调,它会尝试将响应转换为String。使用encoding:null使其返回原始字节 示例 -

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

要将呼叫链接在一起(一个接一个地运行),您可以嵌套回调或使用promises。例如,在另一个请求完成后运行请求 -

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关于如何做到这一点。

以下是bluebird的一个例子(然后用于迭代时效)

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

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