web-dev-qa-db-fra.com

Node JS How to POST image with request data to another server / api

J'essaie de POST une image de mon Node JS app vers une autre REST API. J'ai l'image en Mongo) DB (en tant que données de tableau binaire) qui est lu par Node JS et est ensuite censé être POSTé vers une autre API.

Le problème que je rencontre est de savoir comment envoyer des données de demande avec l'image? J'ai ces données brutes (qui sont au format JSON) qui devraient être affichées avec l'image:

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

Je dois le faire en utilisant le module "demande". Je peux utiliser "multer" si cela aide mieux. Mais, je ne sais pas comment envoyer les données de demande ci-dessus avec le flux d'images. Voici mon code actuel. Pourriez-vous m'aider à terminer?

        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();

MISE À JOUR: 06/06/2017

Il m'est donc arrivé de parler à l'équipe REST qui fournit le point final et a découvert que les données devaient être envoyées dans le format spécifique suivant. Ci-dessous, un instantané de la demande qui a réussi. Pourrait quelqu'un m'aide avec le code Node que je devrais utiliser? J'ai essayé le package de données de formulaire mais j'ai eu la même erreur: Postman Snapshot

7
rajugaadu

si vous avez également le contrôle sur "l'autre API", vous pouvez inclure l'image en tant que représentation base64 des données binaires dans le post-corps (et la décoder du côté de l'API)

réponse à la mise à jour 06/06/2017:

selon la capture d'écran, l'API nécessite plusieurs parties/données de formulaire. ces demandes avec le module "request" sont documentées dans https://github.com/request/request#multipartform-data-multipart-form-uploads

exemple rapide (non testé):

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);
});
9
Fabian

Si vous ajoutez le body à votre demande avec les données JSON, vous devriez pouvoir l'envoyer:

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

Ce que je ne comprends pas, c'est pourquoi vous avez un setTimeout avec res.send lorsqu'aucune variable res n'est définie nulle part.

5