2017-06-01 113 views
1

我想從我的Node JS應用程序將圖像發佈到另一個REST API。我在Mongo DB中具有圖像(作爲二進制數組數據),它由Node JS讀取,然後應該被髮送到另一個API。節點JS如何將POST圖像和請求數據一起發送到另一個服務器/ api

我面對的問題是如何隨圖像一起發送請求數據?我有這樣的原始數據(即JSON格式),應與圖像一起發佈時間:

{"data":{"client":"abc","address": "123"},"meta":{"owner": "yourself","host": "hostishere"}} 

我需要做到這一點使用「請求」模塊。如果這有助於更好的話,我可以使用'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(); 

更新:2017年6月6日

所以,我正好跟我們的REST團隊提供了終點,並發現該數據應在以下具體格式發送。以下是成功請求的快照。有人可以幫我使用我應該使用的Node代碼嗎?我已經嘗試過表單數據包但是得到了同樣的錯誤: Postman Snapshot

+1

爲什麼超時?你應該在'end'事件監聽器中發送你的響應。如果您的請求花費的時間超過1秒,響應將不會完成 –

+0

@JonasZell感謝您指出request.end()的正確用法以及爲什麼應避免使用setTimeout。將進行更改以改進這段代碼。回到你的另一個問題,'res'實際上是請求的響應對象,它調用上述代碼存在的方法(請求從UI到上述代碼,然後調用另一個API) – rajugaadu

+0

對不起...這是針對另一個成員的 - 「回到你的另一個問題,'res'實際上是請求的響應對象,它調用上面的代碼存在的方法(一個請求來自UI到上面的代碼,然後應該調用另一個API)「 – rajugaadu

回答

2

如果您也可以控制「其他API」,那麼您可以將該圖像作爲二進制數據的base64表示形式包含在後體中根據截圖API需要的multipart/FORMDATA

應答(以及在API側對其進行解碼),以更新2017年6月6日。

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); 
}); 
+0

不幸的是,我不@Fabian。但是,您提供了一些我可以更詳細地介紹我未來的優勢 - 「基地64代表」:) – rajugaadu

+0

請問您可以看看我編輯的問題嗎? – rajugaadu

3

如果使用JSON數據添加body你的要求,你應該能夠:與「要求」 這樣的請求 - 模在https://github.com/request/request#multipartform-data-multipart-form-uploads

簡單的例子(未測試)記錄發送:

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"} 
     } 
}; 

我不明白的是爲什麼你有一個res.sendsetTimeout有任何地方沒有定義res變量。

+0

我會試試這個,讓你知道。謝謝 ! – rajugaadu

+0

回答您的其他問題,'res'實際上是請求的響應對象,它調用上述代碼存在的方法(請求從UI到上述代碼,然後調用另一個API)。對不起,在我發佈的代碼中缺少。 – rajugaadu

+0

你確定可以將「body」添加到Http選項嗎? '選項'上的Node JS文檔沒有列出'body'作爲可能的屬性。儘管如此,我已經嘗試了這個建議,但似乎並不奏效。 – rajugaadu

相關問題