节点JS如何将图像与请求数据一起发布到另一个服务器/ api

raj*_*adu 6 javascript http-post node.js multer

我试图将我的Node JS应用程序中的图像发布到另一个REST API.我有Mongo DB中的图像(作为二进制数组数据),由Node JS读取,然后应该发布到另一个API.

我面临的问题是如何与图像一起发送请求数据?我有这个原始数据(采用JSON格式),应与图像一起发布:

{"data":{"client":"abc","address": "123"},"meta":{"owner": "yourself","host": "hostishere"}}
Run Code Online (Sandbox Code Playgroud)

我需要使用'request'模块执行此操作.如果有更好的帮助,我可以使用'multer'.但是,我仍然坚持如何将上述请求数据与图像流一起发送.以下是我目前的代码.你能帮帮我完成吗?

        var options = {
            host: 'hostname.com',
            port: 80,
            path: '/api/content',
            method: 'POST',
            headers:{
                'Content-Type' : 'multipart/form-data'
            }
        };

        var request =  http.request(options, function(response) {
            var str = '';
            var respTime ='';

            response.on('data', function (chunk) {
                str = str.concat(chunk);
            });
            response.on('end', () => {
                console.log('No more data in response.');
            });

            setTimeout(function() {
                res.send(JSON.stringify(
                  {
                      'imageURL': IMG_URL,
                      'imageId': IMG_ID,
                      'body': JSON.parse(str)
                  }
                ));
            }, 1000);
        });

        request.on('error', (e) => {
          console.error('**** problem with request: ', e);
        });

        request.write(image.IMG_STR); //image.IMG_STR is the binary array representation of the image.
        request.end();
Run Code Online (Sandbox Code Playgroud)

更新:06/06/2017

所以,我碰巧与提供终点的REST团队交谈,发现数据应该以下列特定格式发送.以下是成功请求的快照.有人可以帮助我使用我应该使用的Node代码吗?我尝试过form-data包,但是得到了同样的错误: 邮差快照

Fab*_*ian 9

如果您也可以控制"其他API",则可以将图像作为二进制数据的base64表示形式包含在post-body中(并在API端解码)

回答更新06/06/2017:

根据屏幕截图,API需要multipart/formdata.具有"请求"模块的此类请求记录在https://github.com/request/request#multipartform-data-multipart-form-uploads中

快速示例(未测试):

var formData = {
  Data: {data: {client: "abc" ...},
  file: fs.createReadStream('testImage_2.jpg'),
};
request.post({url:'<YourUrl>', formData: formData}, function optionalCallback(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
Run Code Online (Sandbox Code Playgroud)


Mer*_*tis 5

如果您body使用JSON数据添加到您的请求,您应该能够发送它:

 var options = {
        host: 'hostname.com',
        port: 80,
        path: '/api/content',
        method: 'POST',
        headers:{
            'Content-Type' : 'multipart/form-data'
        },
        body: {
            "data": {"client":"abc","address": "123"},
            "meta":{"owner": "yourself","host": "hostishere"}
        }
 };
Run Code Online (Sandbox Code Playgroud)

我不明白的是setTimeout,res.send当没有任何res变量定义时,为什么你有一个with .