How to fix NodeJS request Error: Argument error, options.body
Problem:
You’re using request to send a POST request with a body that should be JSON-encoded, but you are encountering an error similar to this:
Error: Argument error, options.body.
at setContentLength (/home/uli/myproj/node_modules/request/request.js:434:28)
at Request.init (/home/uli/myproj/node_modules/request/request.js:439:5)
at new Request (/home/uli/myproj/node_modules/request/request.js:128:8)
at request (/home/uli/myproj/node_modules/request/index.js:53:10)
at Function.post (/home/uli/myproj/node_modules/request/index.js:61:12)
and, additionally this stacktrace:
TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer
at write_ (_http_outgoing.js:647:11)
at ClientRequest.write (_http_outgoing.js:622:10)
at Request.write (/home/uli/myproj/node_modules/request/request.js:1501:27)
at end (/home/uli/myproj/node_modules/request/request.js:546:18)
at Immediate.<anonymous> (/home/uli/myproj/node_modules/request/request.js:575:7)
at runCallback (timers.js:763:18)
at tryOnImmediate (timers.js:734:5)
at processImmediate (timers.js:716:5)
Solution
The error basically tells you that request can’t determine the length of the body, as you didn’t tell it how to encode the body and it isn’t a simple string or buffer. The solution is to tell request to use JSON body encoding by adding json: true
to the options parameter (first argument to request.post
). A valid options parameter looks like this:
const opts = {
url: 'http://localhost:1234/api/myapi',
body: {/* your body object */},
json: true // <-- Add this line
};