UNPKG

18.2 kBMarkdownView Raw
1# body-parser
2
3[![NPM Version][npm-version-image]][npm-url]
4[![NPM Downloads][npm-downloads-image]][npm-url]
5[![Build Status][ci-image]][ci-url]
6[![Test Coverage][coveralls-image]][coveralls-url]
7
8Node.js body parsing middleware.
9
10Parse incoming request bodies in a middleware before your handlers, available
11under the `req.body` property.
12
13**Note** As `req.body`'s shape is based on user-controlled input, all
14properties and values in this object are untrusted and should be validated
15before trusting. For example, `req.body.foo.toString()` may fail in multiple
16ways, for example the `foo` property may not be there or may not be a string,
17and `toString` may not be a function and instead a string or other user input.
18
19[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/).
20
21_This does not handle multipart bodies_, due to their complex and typically
22large nature. For multipart bodies, you may be interested in the following
23modules:
24
25 * [busboy](https://www.npmjs.org/package/busboy#readme) and
26 [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme)
27 * [multiparty](https://www.npmjs.org/package/multiparty#readme) and
28 [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme)
29 * [formidable](https://www.npmjs.org/package/formidable#readme)
30 * [multer](https://www.npmjs.org/package/multer#readme)
31
32This module provides the following parsers:
33
34 * [JSON body parser](#bodyparserjsonoptions)
35 * [Raw body parser](#bodyparserrawoptions)
36 * [Text body parser](#bodyparsertextoptions)
37 * [URL-encoded form body parser](#bodyparserurlencodedoptions)
38
39Other body parsers you might be interested in:
40
41- [body](https://www.npmjs.org/package/body#readme)
42- [co-body](https://www.npmjs.org/package/co-body#readme)
43
44## Installation
45
46```sh
47$ npm install body-parser
48```
49
50## API
51
52```js
53var bodyParser = require('body-parser')
54```
55
56The `bodyParser` object exposes various factories to create middlewares. All
57middlewares will populate the `req.body` property with the parsed body when
58the `Content-Type` request header matches the `type` option, or an empty
59object (`{}`) if there was no body to parse, the `Content-Type` was not matched,
60or an error occurred.
61
62The various errors returned by this module are described in the
63[errors section](#errors).
64
65### bodyParser.json([options])
66
67Returns middleware that only parses `json` and only looks at requests where
68the `Content-Type` header matches the `type` option. This parser accepts any
69Unicode encoding of the body and supports automatic inflation of `gzip` and
70`deflate` encodings.
71
72A new `body` object containing the parsed data is populated on the `request`
73object after the middleware (i.e. `req.body`).
74
75#### Options
76
77The `json` function takes an optional `options` object that may contain any of
78the following keys:
79
80##### inflate
81
82When set to `true`, then deflated (compressed) bodies will be inflated; when
83`false`, deflated bodies are rejected. Defaults to `true`.
84
85##### limit
86
87Controls the maximum request body size. If this is a number, then the value
88specifies the number of bytes; if it is a string, the value is passed to the
89[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
90to `'100kb'`.
91
92##### reviver
93
94The `reviver` option is passed directly to `JSON.parse` as the second
95argument. You can find more information on this argument
96[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter).
97
98##### strict
99
100When set to `true`, will only accept arrays and objects; when `false` will
101accept anything `JSON.parse` accepts. Defaults to `true`.
102
103##### type
104
105The `type` option is used to determine what media type the middleware will
106parse. This option can be a string, array of strings, or a function. If not a
107function, `type` option is passed directly to the
108[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
109be an extension name (like `json`), a mime type (like `application/json`), or
110a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type`
111option is called as `fn(req)` and the request is parsed if it returns a truthy
112value. Defaults to `application/json`.
113
114##### verify
115
116The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
117where `buf` is a `Buffer` of the raw request body and `encoding` is the
118encoding of the request. The parsing can be aborted by throwing an error.
119
120### bodyParser.raw([options])
121
122Returns middleware that parses all bodies as a `Buffer` and only looks at
123requests where the `Content-Type` header matches the `type` option. This
124parser supports automatic inflation of `gzip` and `deflate` encodings.
125
126A new `body` object containing the parsed data is populated on the `request`
127object after the middleware (i.e. `req.body`). This will be a `Buffer` object
128of the body.
129
130#### Options
131
132The `raw` function takes an optional `options` object that may contain any of
133the following keys:
134
135##### inflate
136
137When set to `true`, then deflated (compressed) bodies will be inflated; when
138`false`, deflated bodies are rejected. Defaults to `true`.
139
140##### limit
141
142Controls the maximum request body size. If this is a number, then the value
143specifies the number of bytes; if it is a string, the value is passed to the
144[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
145to `'100kb'`.
146
147##### type
148
149The `type` option is used to determine what media type the middleware will
150parse. This option can be a string, array of strings, or a function.
151If not a function, `type` option is passed directly to the
152[type-is](https://www.npmjs.org/package/type-is#readme) library and this
153can be an extension name (like `bin`), a mime type (like
154`application/octet-stream`), or a mime type with a wildcard (like `*/*` or
155`application/*`). If a function, the `type` option is called as `fn(req)`
156and the request is parsed if it returns a truthy value. Defaults to
157`application/octet-stream`.
158
159##### verify
160
161The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
162where `buf` is a `Buffer` of the raw request body and `encoding` is the
163encoding of the request. The parsing can be aborted by throwing an error.
164
165### bodyParser.text([options])
166
167Returns middleware that parses all bodies as a string and only looks at
168requests where the `Content-Type` header matches the `type` option. This
169parser supports automatic inflation of `gzip` and `deflate` encodings.
170
171A new `body` string containing the parsed data is populated on the `request`
172object after the middleware (i.e. `req.body`). This will be a string of the
173body.
174
175#### Options
176
177The `text` function takes an optional `options` object that may contain any of
178the following keys:
179
180##### defaultCharset
181
182Specify the default character set for the text content if the charset is not
183specified in the `Content-Type` header of the request. Defaults to `utf-8`.
184
185##### inflate
186
187When set to `true`, then deflated (compressed) bodies will be inflated; when
188`false`, deflated bodies are rejected. Defaults to `true`.
189
190##### limit
191
192Controls the maximum request body size. If this is a number, then the value
193specifies the number of bytes; if it is a string, the value is passed to the
194[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
195to `'100kb'`.
196
197##### type
198
199The `type` option is used to determine what media type the middleware will
200parse. This option can be a string, array of strings, or a function. If not
201a function, `type` option is passed directly to the
202[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
203be an extension name (like `txt`), a mime type (like `text/plain`), or a mime
204type with a wildcard (like `*/*` or `text/*`). If a function, the `type`
205option is called as `fn(req)` and the request is parsed if it returns a
206truthy value. Defaults to `text/plain`.
207
208##### verify
209
210The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
211where `buf` is a `Buffer` of the raw request body and `encoding` is the
212encoding of the request. The parsing can be aborted by throwing an error.
213
214### bodyParser.urlencoded([options])
215
216Returns middleware that only parses `urlencoded` bodies and only looks at
217requests where the `Content-Type` header matches the `type` option. This
218parser accepts only UTF-8 encoding of the body and supports automatic
219inflation of `gzip` and `deflate` encodings.
220
221A new `body` object containing the parsed data is populated on the `request`
222object after the middleware (i.e. `req.body`). This object will contain
223key-value pairs, where the value can be a string or array (when `extended` is
224`false`), or any type (when `extended` is `true`).
225
226#### Options
227
228The `urlencoded` function takes an optional `options` object that may contain
229any of the following keys:
230
231##### extended
232
233The `extended` option allows to choose between parsing the URL-encoded data
234with the `querystring` library (when `false`) or the `qs` library (when
235`true`). The "extended" syntax allows for rich objects and arrays to be
236encoded into the URL-encoded format, allowing for a JSON-like experience
237with URL-encoded. For more information, please
238[see the qs library](https://www.npmjs.org/package/qs#readme).
239
240Defaults to `true`, but using the default has been deprecated. Please
241research into the difference between `qs` and `querystring` and choose the
242appropriate setting.
243
244##### inflate
245
246When set to `true`, then deflated (compressed) bodies will be inflated; when
247`false`, deflated bodies are rejected. Defaults to `true`.
248
249##### limit
250
251Controls the maximum request body size. If this is a number, then the value
252specifies the number of bytes; if it is a string, the value is passed to the
253[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
254to `'100kb'`.
255
256##### parameterLimit
257
258The `parameterLimit` option controls the maximum number of parameters that
259are allowed in the URL-encoded data. If a request contains more parameters
260than this value, a 413 will be returned to the client. Defaults to `1000`.
261
262##### type
263
264The `type` option is used to determine what media type the middleware will
265parse. This option can be a string, array of strings, or a function. If not
266a function, `type` option is passed directly to the
267[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
268be an extension name (like `urlencoded`), a mime type (like
269`application/x-www-form-urlencoded`), or a mime type with a wildcard (like
270`*/x-www-form-urlencoded`). If a function, the `type` option is called as
271`fn(req)` and the request is parsed if it returns a truthy value. Defaults
272to `application/x-www-form-urlencoded`.
273
274##### verify
275
276The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
277where `buf` is a `Buffer` of the raw request body and `encoding` is the
278encoding of the request. The parsing can be aborted by throwing an error.
279
280## Errors
281
282The middlewares provided by this module create errors using the
283[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors
284will typically have a `status`/`statusCode` property that contains the suggested
285HTTP response code, an `expose` property to determine if the `message` property
286should be displayed to the client, a `type` property to determine the type of
287error without matching against the `message`, and a `body` property containing
288the read body, if available.
289
290The following are the common errors created, though any error can come through
291for various reasons.
292
293### content encoding unsupported
294
295This error will occur when the request had a `Content-Encoding` header that
296contained an encoding but the "inflation" option was set to `false`. The
297`status` property is set to `415`, the `type` property is set to
298`'encoding.unsupported'`, and the `charset` property will be set to the
299encoding that is unsupported.
300
301### entity parse failed
302
303This error will occur when the request contained an entity that could not be
304parsed by the middleware. The `status` property is set to `400`, the `type`
305property is set to `'entity.parse.failed'`, and the `body` property is set to
306the entity value that failed parsing.
307
308### entity verify failed
309
310This error will occur when the request contained an entity that could not be
311failed verification by the defined `verify` option. The `status` property is
312set to `403`, the `type` property is set to `'entity.verify.failed'`, and the
313`body` property is set to the entity value that failed verification.
314
315### request aborted
316
317This error will occur when the request is aborted by the client before reading
318the body has finished. The `received` property will be set to the number of
319bytes received before the request was aborted and the `expected` property is
320set to the number of expected bytes. The `status` property is set to `400`
321and `type` property is set to `'request.aborted'`.
322
323### request entity too large
324
325This error will occur when the request body's size is larger than the "limit"
326option. The `limit` property will be set to the byte limit and the `length`
327property will be set to the request body's length. The `status` property is
328set to `413` and the `type` property is set to `'entity.too.large'`.
329
330### request size did not match content length
331
332This error will occur when the request's length did not match the length from
333the `Content-Length` header. This typically occurs when the request is malformed,
334typically when the `Content-Length` header was calculated based on characters
335instead of bytes. The `status` property is set to `400` and the `type` property
336is set to `'request.size.invalid'`.
337
338### stream encoding should not be set
339
340This error will occur when something called the `req.setEncoding` method prior
341to this middleware. This module operates directly on bytes only and you cannot
342call `req.setEncoding` when using this module. The `status` property is set to
343`500` and the `type` property is set to `'stream.encoding.set'`.
344
345### stream is not readable
346
347This error will occur when the request is no longer readable when this middleware
348attempts to read it. This typically means something other than a middleware from
349this module read the request body already and the middleware was also configured to
350read the same request. The `status` property is set to `500` and the `type`
351property is set to `'stream.not.readable'`.
352
353### too many parameters
354
355This error will occur when the content of the request exceeds the configured
356`parameterLimit` for the `urlencoded` parser. The `status` property is set to
357`413` and the `type` property is set to `'parameters.too.many'`.
358
359### unsupported charset "BOGUS"
360
361This error will occur when the request had a charset parameter in the
362`Content-Type` header, but the `iconv-lite` module does not support it OR the
363parser does not support it. The charset is contained in the message as well
364as in the `charset` property. The `status` property is set to `415`, the
365`type` property is set to `'charset.unsupported'`, and the `charset` property
366is set to the charset that is unsupported.
367
368### unsupported content encoding "bogus"
369
370This error will occur when the request had a `Content-Encoding` header that
371contained an unsupported encoding. The encoding is contained in the message
372as well as in the `encoding` property. The `status` property is set to `415`,
373the `type` property is set to `'encoding.unsupported'`, and the `encoding`
374property is set to the encoding that is unsupported.
375
376## Examples
377
378### Express/Connect top-level generic
379
380This example demonstrates adding a generic JSON and URL-encoded parser as a
381top-level middleware, which will parse the bodies of all incoming requests.
382This is the simplest setup.
383
384```js
385var express = require('express')
386var bodyParser = require('body-parser')
387
388var app = express()
389
390// parse application/x-www-form-urlencoded
391app.use(bodyParser.urlencoded({ extended: false }))
392
393// parse application/json
394app.use(bodyParser.json())
395
396app.use(function (req, res) {
397 res.setHeader('Content-Type', 'text/plain')
398 res.write('you posted:\n')
399 res.end(JSON.stringify(req.body, null, 2))
400})
401```
402
403### Express route-specific
404
405This example demonstrates adding body parsers specifically to the routes that
406need them. In general, this is the most recommended way to use body-parser with
407Express.
408
409```js
410var express = require('express')
411var bodyParser = require('body-parser')
412
413var app = express()
414
415// create application/json parser
416var jsonParser = bodyParser.json()
417
418// create application/x-www-form-urlencoded parser
419var urlencodedParser = bodyParser.urlencoded({ extended: false })
420
421// POST /login gets urlencoded bodies
422app.post('/login', urlencodedParser, function (req, res) {
423 res.send('welcome, ' + req.body.username)
424})
425
426// POST /api/users gets JSON bodies
427app.post('/api/users', jsonParser, function (req, res) {
428 // create user in req.body
429})
430```
431
432### Change accepted type for parsers
433
434All the parsers accept a `type` option which allows you to change the
435`Content-Type` that the middleware will parse.
436
437```js
438var express = require('express')
439var bodyParser = require('body-parser')
440
441var app = express()
442
443// parse various different custom JSON types as JSON
444app.use(bodyParser.json({ type: 'application/*+json' }))
445
446// parse some custom thing into a Buffer
447app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
448
449// parse an HTML body into a string
450app.use(bodyParser.text({ type: 'text/html' }))
451```
452
453## License
454
455[MIT](LICENSE)
456
457[ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci
458[ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml
459[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master
460[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master
461[node-version-image]: https://badgen.net/npm/node/body-parser
462[node-version-url]: https://nodejs.org/en/download
463[npm-downloads-image]: https://badgen.net/npm/dm/body-parser
464[npm-url]: https://npmjs.org/package/body-parser
465[npm-version-image]: https://badgen.net/npm/v/body-parser