Я пытаюсь POST изображение из моего приложения Node JS в другой REST API. У меня есть изображение в Mongo DB (в виде двоичных данных массива), которое считывается Node JS, а затем должно быть POSTED для другого 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();
ОБНОВЛЕНИЕ: 06/06/2017
Итак, мне довелось поговорить с командой REST, которая обеспечивает конечную точку, и выяснила, что данные должны быть отправлены в следующем конкретном формате. Ниже приведен снимок выполненного запроса. Может ли кто-нибудь помочь мне с кодом узла, который я должен использовать? Я попробовал пакет данных формы, но получил ту же ошибку:
если вы также контролируете "другой API", вы можете включить изображение как представление base64 двоичных данных в пост-тело (и декодировать его на стороне API)
ответ на обновление 06/06/2017:
согласно скриншоту API требует multipart/formdata. такие запросы с "запросом" -module документируются в 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);
});
Если вы добавите 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"}
}
};
Я не понимаю, почему у вас есть setTimeout
с res.send
когда нет переменной res
определенной где угодно.