黑人生命也是命。
支持平等正義倡議.

body-parser

NPM Version NPM Downloads Build Status Test Coverage

Node.js 主體剖析中介軟體。

在處理常式前,剖析傳入的請求主體,可於 req.body 屬性中取得。

注意由於 req.body 的形狀基於使用者控制的輸入,因此此物件中的所有屬性和值均不可信,且應在信任之前進行驗證。例如,req.body.foo.toString() 可能會以多種方式失敗,例如 foo 屬性可能不存在或不是字串,而 toString 可能不是函式,而是字串或其他使用者輸入。

在 Node.js 中了解 HTTP 交易的結構.

這不處理多部分主體,因為它們的性質複雜且通常很大。對於多部分主體,您可能對以下模組有興趣

此模組提供以下剖析器

您可能感興趣的其他主體剖析器

安裝

$ npm install body-parser

API

var bodyParser = require('body-parser')

bodyParser 物件公開各種工廠來建立中間件。當 Content-Type 要求標頭與 type 選項相符時,所有中間件都會使用已剖析的主體填入 req.body 屬性,或在沒有主體可剖析、Content-Type 不相符或發生錯誤時填入一個空物件 ({})。

此模組傳回的各種錯誤在 錯誤區段 中說明。

bodyParser.json([options])

傳回只剖析 json 且只查看 Content-Type 標頭與 type 選項相符的要求的中間件。此剖析器接受主體的任何 Unicode 編碼,並支援自動膨脹 gzipdeflate 編碼。

在中間件 (即 req.body) 之後,會在 request 物件上填入包含已剖析資料的新 body 物件。

選項

json 函數會接受一個選用的 options 物件,其中可能包含下列任一金鑰

inflate

設定為 true 時,會膨脹已壓縮 (壓縮) 的主體;設定為 false 時,會拒絕已壓縮的主體。預設為 true

limit

控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'

reviver

reviver 選項會直接傳遞給 JSON.parse 作為第二個參數。您可以在 MDN 關於 JSON.parse 的文件 中找到更多關於此參數的資訊。

strict

設定為 true 時,只會接受陣列和物件;設定為 false 時,會接受 JSON.parse 接受的任何內容。預設為 true

type

type 選項用於決定中間件將解析哪種類型的媒體。此選項可以是字串、字串陣列或函式。如果非函式,type 選項會直接傳遞給 type-is 函式庫,這可以是副檔名 (例如 json)、MIME 類型 (例如 application/json) 或帶有萬用字元的 MIME 類型 (例如 */**/json)。如果為函式,type 選項會以 fn(req) 的方式呼叫,如果傳回真值,則會解析請求。預設為 application/json

verify

如果提供了 verify 選項,則會以 verify(req, res, buf, encoding) 的方式呼叫,其中 buf 是原始請求主體的 Buffer,而 encoding 是請求的編碼。可以透過擲回錯誤來中止解析。

bodyParser.raw([options])

傳回將所有主體解析為 Buffer 的中間件,並且只查看 Content-Type 標頭與 type 選項相符的請求。此解析器支援自動膨脹 gzipdeflate 編碼。

在中間件之後 (即 req.body),會在 request 物件上填充一個包含已解析資料的新 body 物件。這將會是主體的 Buffer 物件。

選項

raw 函式會接受一個選用的 options 物件,其中可能包含下列任一金鑰

inflate

設定為 true 時,會膨脹已壓縮 (壓縮) 的主體;設定為 false 時,會拒絕已壓縮的主體。預設為 true

limit

控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'

type

type 選項用於決定中間件將解析哪種類型的媒體。此選項可以是字串、字串陣列或函式。若非函式,type 選項會直接傳遞至 type-is 函式庫,這可以是副檔名(例如 bin)、MIME 類型(例如 application/octet-stream)或帶有萬用字元的 MIME 類型(例如 */*application/*)。若為函式,type 選項會呼叫為 fn(req),如果回傳真值,則會解析要求。預設為 application/octet-stream

verify

如果提供了 verify 選項,則會以 verify(req, res, buf, encoding) 的方式呼叫,其中 buf 是原始請求主體的 Buffer,而 encoding 是請求的編碼。可以透過擲回錯誤來中止解析。

bodyParser.text([options])

傳回中間件,將所有主體解析為字串,且只查看 Content-Type 標頭與 type 選項相符的要求。此解析器支援自動膨脹 gzipdeflate 編碼。

在中間件(即 req.body)之後,解析的資料會填充在 request 物件上一個新的 body 字串。這會是主體的字串。

選項

text 函式會取得一個選用的 options 物件,其中可能包含下列任一金鑰

defaultCharset

如果要求的 Content-Type 標頭中未指定字元集,請指定文字內容的預設字元集。預設為 utf-8

inflate

設定為 true 時,會膨脹已壓縮 (壓縮) 的主體;設定為 false 時,會拒絕已壓縮的主體。預設為 true

limit

控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'

type

type 選項用於決定中間件會解析哪種媒體類型。這個選項可以是字串、字串陣列或函式。如果非函式,type 選項會直接傳遞給 type-is 函式庫,它可以是副檔名 (例如 txt)、MIME 類型 (例如 text/plain) 或具有萬用字元的 MIME 類型 (例如 */*text/*)。如果為函式,type 選項會以 fn(req) 呼叫,如果傳回真值,則會解析要求。預設為 text/plain

verify

如果提供了 verify 選項,則會以 verify(req, res, buf, encoding) 的方式呼叫,其中 buf 是原始請求主體的 Buffer,而 encoding 是請求的編碼。可以透過擲回錯誤來中止解析。

bodyParser.urlencoded([options])

傳回僅解析 urlencoded 主體的中間件,而且只會查看 Content-Type 標頭與 type 選項相符的要求。這個解析器只接受主體的 UTF-8 編碼,並支援自動膨脹 gzipdeflate 編碼。

在中間件 (即 req.body) 後,會在 request 物件上建立一個包含已解析資料的新 body 物件。這個物件會包含鍵值對,其中值可以是字串或陣列 (當 extendedfalse) 或任何類型 (當 extendedtrue)。

選項

urlencoded 函式會接受一個選用的 options 物件,其中可能包含下列任一金鑰

extended

extended 選項允許選擇使用 querystring 函式庫 (當為 false) 或 qs 函式庫 (當為 true) 來解析 URL 編碼的資料。「延伸」語法允許將豐富的物件和陣列編碼成 URL 編碼格式,讓 URL 編碼具有類似 JSON 的體驗。如需更多資訊,請 參閱 qs 函式庫

預設為 true,但使用預設值已不建議。請研究 qsquerystring 之間的差異,並選擇適當的設定。

inflate

設定為 true 時,會膨脹已壓縮 (壓縮) 的主體;設定為 false 時,會拒絕已壓縮的主體。預設為 true

limit

控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'

parameterLimit

parameterLimit 選項控制 URL 編碼資料中允許的最大參數數。如果請求包含超過此值的參數,則會傳回 413 給用戶端。預設為 1000

type

type 選項用於決定中間件將解析哪種類型的媒體。此選項可以是字串、字串陣列或函式。如果不是函式,則 type 選項會直接傳遞給 type-is 函式庫,這可以是副檔名 (例如 urlencoded)、MIME 類型 (例如 application/x-www-form-urlencoded) 或具有萬用字元的 MIME 類型 (例如 */x-www-form-urlencoded)。如果為函式,則 type 選項會以 fn(req) 呼叫,如果傳回真值,則會解析請求。預設為 application/x-www-form-urlencoded

verify

如果提供了 verify 選項,則會以 verify(req, res, buf, encoding) 的方式呼叫,其中 buf 是原始請求主體的 Buffer,而 encoding 是請求的編碼。可以透過擲回錯誤來中止解析。

錯誤

此模組提供的中間件會使用 http-errors 模組 建立錯誤。錯誤通常會有包含建議的 HTTP 回應代碼的 status/statusCode 屬性、用於決定是否應將 message 屬性顯示給用戶端的 expose 屬性、用於在不比對 message 的情況下決定錯誤類型的 type 屬性,以及包含已讀取主體 (如果有的話) 的 body 屬性。

以下是建立的常見錯誤,儘管任何錯誤都可能因各種原因而產生。

不支援的內容編碼

此錯誤會在請求包含 Content-Encoding 標頭(其中包含編碼)但將「膨脹」選項設定為 false 時發生。status 屬性設定為 415type 屬性設定為 'encoding.unsupported',而 charset 屬性會設定為不支援的編碼。

實體剖析失敗

此錯誤會在請求包含中介軟體無法剖析的實體時發生。status 屬性設定為 400type 屬性設定為 'entity.parse.failed',而 body 屬性設定為剖析失敗的實體值。

實體驗證失敗

此錯誤會在請求包含無法通過已定義 verify 選項驗證的實體時發生。status 屬性設定為 403type 屬性設定為 'entity.verify.failed',而 body 屬性設定為驗證失敗的實體值。

請求已中止

此錯誤會在主體讀取完成前,請求被用戶端中止時發生。received 屬性會設定為請求中止前接收到的位元組數,而 expected 屬性會設定為預期的位元組數。status 屬性設定為 400,而 type 屬性設定為 'request.aborted'

請求實體過大

此錯誤會在請求主體大小超過「限制」選項時發生。limit 屬性會設定為位元組限制,而 length 屬性會設定為請求主體長度。status 屬性設定為 413,而 type 屬性設定為 'entity.too.large'

要求大小與內容長度不符

當要求的長度與 Content-Length 標頭中的長度不符時,將會發生此錯誤。這通常發生在要求格式錯誤時,特別是當 Content-Length 標頭是根據字元而非位元組計算時。status 屬性設為 400type 屬性設為 'request.size.invalid'

不應設定串流編碼

當在這個中間軟體之前呼叫稱為 req.setEncoding 的方法時,將會發生此錯誤。這個模組僅直接在位元組上執行,使用這個模組時無法呼叫 req.setEncodingstatus 屬性設為 500type 屬性設為 'stream.encoding.set'

串流不可讀取

當這個中間軟體嘗試讀取要求時,如果要求不再可讀取,將會發生此錯誤。這通常表示這個模組中的中間軟體以外的其他東西已經讀取了要求主體,而且中間軟體也設定為讀取相同的請求。status 屬性設為 500type 屬性設為 'stream.not.readable'

過多參數

當要求的內容超過 urlencoded 剖析器的設定 parameterLimit 時,將會發生此錯誤。status 屬性設為 413type 屬性設為 'parameters.too.many'

不支援的字元集 “BOGUS”

當要求在 Content-Type 標頭中具有字元集參數,但 iconv-lite 模組不支援它或剖析器不支援它時,將會發生此錯誤。字元集包含在訊息中以及 charset 屬性中。status 屬性設為 415type 屬性設為 'charset.unsupported'charset 屬性設為不支援的字元集。

不支援的內容編碼 “bogus”

當請求包含不支援的編碼之 Content-Encoding 標頭時,將會發生此錯誤。編碼包含在訊息中,也包含在 encoding 屬性中。status 屬性設為 415type 屬性設為 'encoding.unsupported',而 encoding 屬性則設為不支援的編碼。

範例

Express/Connect 頂層通用

此範例示範如何將通用 JSON 和 URL 編碼的剖析器新增為頂層中介軟體,這將剖析所有傳入請求的主體。這是最簡單的設定。

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res) {
  res.setHeader('Content-Type', 'text/plain')
  res.write('you posted:\n')
  res.end(JSON.stringify(req.body, null, 2))
})

Express 路徑特定

此範例示範如何將主體剖析器特別新增至需要它們的路徑。一般來說,這是建議使用 Express 搭配 body-parser 的方式。

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// create application/json parser
var jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})

// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})

變更剖析器的可接受類型

所有剖析器都接受 type 選項,讓您可以變更中介軟體將剖析的 Content-Type

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' }))

// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))

// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }))

授權

MIT