Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send an object in multipart formData using request in node.js

I'm trying to formulate a POST using request, but I keep getting an error anytime I try and add the to object to formData.

var fs      = require('fs');
var request = require('request');
var file    = './test/assets/test.pdf';

var opts = {
  url: 'my_service',
  method: 'POST',
  auth: { user: 'username', password: 'password' },
  json: true,
  formData: {
    front: fs.createReadStream(file),
    to: {
      name: 'joe bob',
      address_1: '123 main st',
      ...
    }
  }
};

request(opts, function(err, resp, body) {
  console.log(err, body);
});

Here is the error:

/sandbox/project/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
  source.on('error', function() {});
         ^
TypeError: undefined is not a function
    at Function.DelayedStream.create (/Users/me/sandbox/project/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
    at FormData.CombinedStream.append (/Users/me/sandbox/project/node_modules/request/node_modules/combined-stream/lib/combined_stream.js:43:37)
    at FormData.append (/Users/me/sandbox/lproject/node_modules/request/node_modules/form-data/lib/form_data.js:43:3)
    at appendFormValue (/Users/me/sandbox/project/node_modules/request/request.js:466:21)
    at Request.init (/Users/me/sandbox/project/node_modules/request/request.js:477:11)
    at new Request (/Users/me/sandbox/project/node_modules/request/request.js:264:8)
    at request (/Users/me/sandbox/project/node_modules/request/index.js:50:10)
    at Object.<anonymous> (/Users/me/sandbox/project/test.js:30:1)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)

If I remove the to object, everything works.

Why is this - what am I doing wrong?

like image 410
doremi Avatar asked Mar 19 '15 19:03

doremi


People also ask

How do you send a file using multipart form data?

Follow this rules when creating a multipart form: Specify enctype="multipart/form-data" attribute on a form tag. Add a name attribute to a single input type="file" tag. DO NOT add a name attribute to any other input, select or textarea tags.

How do I send a body as FormData in request?

To post HTML form data to the server in URL-encoded format, you need to make an HTTP POST request to the server and provide the HTML form data in the body of the POST message. You also need to specify the data type using the Content-Type: application/x-www-form-urlencoded request header.


1 Answers

The formData attribute doesn't handle objects passed in as a value. see the documentation. A solution would be to use JSON.stringify

var fs      = require('fs');
var request = require('request');
var file    = './test/assets/test.pdf';

var toObj = {
  name: 'joe bob',
  address_1: '123 main st',
  ...
};
var opts = {
  url: 'my_service',
  method: 'POST',
  auth: { user: 'username', password: 'password' },
  json: true,
  formData: {
    front: fs.createReadStream(file),
    to: JSON.stringify(toObj)
  }
};

request(opts, function(err, resp, body) {
  console.log(err, body);
});

note: It's actually the form-data package which supports only strings. Request uses form-data. Here's their usage doc which mentions using "a string, a buffer and a file stream."

like image 189
Jordan Shurmer Avatar answered Nov 03 '22 01:11

Jordan Shurmer