Узел JS Как отправить изображение вместе с запросом данных на другой сервер / API

1

Я пытаюсь 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, которая обеспечивает конечную точку, и выяснила, что данные должны быть отправлены в следующем конкретном формате. Ниже приведен снимок выполненного запроса. Может ли кто-нибудь помочь мне с кодом узла, который я должен использовать? Я попробовал пакет данных формы, но получил ту же ошибку: Изображение 174551

Теги:
multer
http-post

2 ответа

4
Лучший ответ

если вы также контролируете "другой 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);
});
  • 0
    К сожалению, я не @Fabian. Тем не менее, вы предоставили кое-что, что я могу рассказать более подробно для моей будущей выгоды - «представление base 64» :)
  • 0
    не могли бы вы взглянуть на мой отредактированный вопрос?
3

Если вы добавите 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 определенной где угодно.

  • 0
    Возвращаясь к вашему другому вопросу, «res» фактически является объектом ответа для запроса, который вызывает метод, в котором существует вышеуказанный код (запрос поступает из пользовательского интерфейса в приведенный выше код, который затем должен вызывать другой API). Извините, что пропустил это в моем опубликованном коде.
  • 0
    Вы уверены, что «тело» может быть добавлено в Http Options? В документации Node JS по 'options' не указано 'body' в качестве возможного свойства. Тем не менее, я попробовал рекомендацию, и, похоже, она не работает.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню