Node.js 主體剖析中介軟體。
在處理常式前,剖析傳入的請求主體,可於 req.body
屬性中取得。
注意由於 req.body
的形狀基於使用者控制的輸入,因此此物件中的所有屬性和值均不可信,且應在信任之前進行驗證。例如,req.body.foo.toString()
可能會以多種方式失敗,例如 foo
屬性可能不存在或不是字串,而 toString
可能不是函式,而是字串或其他使用者輸入。
這不處理多部分主體,因為它們的性質複雜且通常很大。對於多部分主體,您可能對以下模組有興趣
此模組提供以下剖析器
您可能感興趣的其他主體剖析器
$ npm install body-parser
var bodyParser = require('body-parser')
bodyParser
物件公開各種工廠來建立中間件。當 Content-Type
要求標頭與 type
選項相符時,所有中間件都會使用已剖析的主體填入 req.body
屬性,或在沒有主體可剖析、Content-Type
不相符或發生錯誤時填入一個空物件 ({}
)。
此模組傳回的各種錯誤在 錯誤區段 中說明。
傳回只剖析 json
且只查看 Content-Type
標頭與 type
選項相符的要求的中間件。此剖析器接受主體的任何 Unicode 編碼,並支援自動膨脹 gzip
和 deflate
編碼。
在中間件 (即 req.body
) 之後,會在 request
物件上填入包含已剖析資料的新 body
物件。
json
函數會接受一個選用的 options
物件,其中可能包含下列任一金鑰
設定為 true
時,會膨脹已壓縮 (壓縮) 的主體;設定為 false
時,會拒絕已壓縮的主體。預設為 true
。
控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'
。
reviver
選項會直接傳遞給 JSON.parse
作為第二個參數。您可以在 MDN 關於 JSON.parse 的文件 中找到更多關於此參數的資訊。
設定為 true
時,只會接受陣列和物件;設定為 false
時,會接受 JSON.parse
接受的任何內容。預設為 true
。
type
選項用於決定中間件將解析哪種類型的媒體。此選項可以是字串、字串陣列或函式。如果非函式,type
選項會直接傳遞給 type-is 函式庫,這可以是副檔名 (例如 json
)、MIME 類型 (例如 application/json
) 或帶有萬用字元的 MIME 類型 (例如 */*
或 */json
)。如果為函式,type
選項會以 fn(req)
的方式呼叫,如果傳回真值,則會解析請求。預設為 application/json
。
如果提供了 verify
選項,則會以 verify(req, res, buf, encoding)
的方式呼叫,其中 buf
是原始請求主體的 Buffer
,而 encoding
是請求的編碼。可以透過擲回錯誤來中止解析。
傳回將所有主體解析為 Buffer
的中間件,並且只查看 Content-Type
標頭與 type
選項相符的請求。此解析器支援自動膨脹 gzip
和 deflate
編碼。
在中間件之後 (即 req.body
),會在 request
物件上填充一個包含已解析資料的新 body
物件。這將會是主體的 Buffer
物件。
raw
函式會接受一個選用的 options
物件,其中可能包含下列任一金鑰
設定為 true
時,會膨脹已壓縮 (壓縮) 的主體;設定為 false
時,會拒絕已壓縮的主體。預設為 true
。
控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'
。
type
選項用於決定中間件將解析哪種類型的媒體。此選項可以是字串、字串陣列或函式。若非函式,type
選項會直接傳遞至 type-is 函式庫,這可以是副檔名(例如 bin
)、MIME 類型(例如 application/octet-stream
)或帶有萬用字元的 MIME 類型(例如 */*
或 application/*
)。若為函式,type
選項會呼叫為 fn(req)
,如果回傳真值,則會解析要求。預設為 application/octet-stream
。
如果提供了 verify
選項,則會以 verify(req, res, buf, encoding)
的方式呼叫,其中 buf
是原始請求主體的 Buffer
,而 encoding
是請求的編碼。可以透過擲回錯誤來中止解析。
傳回中間件,將所有主體解析為字串,且只查看 Content-Type
標頭與 type
選項相符的要求。此解析器支援自動膨脹 gzip
和 deflate
編碼。
在中間件(即 req.body
)之後,解析的資料會填充在 request
物件上一個新的 body
字串。這會是主體的字串。
text
函式會取得一個選用的 options
物件,其中可能包含下列任一金鑰
如果要求的 Content-Type
標頭中未指定字元集,請指定文字內容的預設字元集。預設為 utf-8
。
設定為 true
時,會膨脹已壓縮 (壓縮) 的主體;設定為 false
時,會拒絕已壓縮的主體。預設為 true
。
控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'
。
type
選項用於決定中間件會解析哪種媒體類型。這個選項可以是字串、字串陣列或函式。如果非函式,type
選項會直接傳遞給 type-is 函式庫,它可以是副檔名 (例如 txt
)、MIME 類型 (例如 text/plain
) 或具有萬用字元的 MIME 類型 (例如 */*
或 text/*
)。如果為函式,type
選項會以 fn(req)
呼叫,如果傳回真值,則會解析要求。預設為 text/plain
。
如果提供了 verify
選項,則會以 verify(req, res, buf, encoding)
的方式呼叫,其中 buf
是原始請求主體的 Buffer
,而 encoding
是請求的編碼。可以透過擲回錯誤來中止解析。
傳回僅解析 urlencoded
主體的中間件,而且只會查看 Content-Type
標頭與 type
選項相符的要求。這個解析器只接受主體的 UTF-8 編碼,並支援自動膨脹 gzip
和 deflate
編碼。
在中間件 (即 req.body
) 後,會在 request
物件上建立一個包含已解析資料的新 body
物件。這個物件會包含鍵值對,其中值可以是字串或陣列 (當 extended
為 false
) 或任何類型 (當 extended
為 true
)。
urlencoded
函式會接受一個選用的 options
物件,其中可能包含下列任一金鑰
extended
選項允許選擇使用 querystring
函式庫 (當為 false
) 或 qs
函式庫 (當為 true
) 來解析 URL 編碼的資料。「延伸」語法允許將豐富的物件和陣列編碼成 URL 編碼格式,讓 URL 編碼具有類似 JSON 的體驗。如需更多資訊,請 參閱 qs 函式庫。
預設為 true
,但使用預設值已不建議。請研究 qs
和 querystring
之間的差異,並選擇適當的設定。
設定為 true
時,會膨脹已壓縮 (壓縮) 的主體;設定為 false
時,會拒絕已壓縮的主體。預設為 true
。
控制最大要求主體大小。如果這是一個數字,則此值指定位元組數;如果它是一個字串,則此值會傳遞給 bytes 函式庫進行剖析。預設為 '100kb'
。
parameterLimit
選項控制 URL 編碼資料中允許的最大參數數。如果請求包含超過此值的參數,則會傳回 413 給用戶端。預設為 1000
。
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(req, res, buf, encoding)
的方式呼叫,其中 buf
是原始請求主體的 Buffer
,而 encoding
是請求的編碼。可以透過擲回錯誤來中止解析。
此模組提供的中間件會使用 http-errors
模組 建立錯誤。錯誤通常會有包含建議的 HTTP 回應代碼的 status
/statusCode
屬性、用於決定是否應將 message
屬性顯示給用戶端的 expose
屬性、用於在不比對 message
的情況下決定錯誤類型的 type
屬性,以及包含已讀取主體 (如果有的話) 的 body
屬性。
以下是建立的常見錯誤,儘管任何錯誤都可能因各種原因而產生。
此錯誤會在請求包含 Content-Encoding
標頭(其中包含編碼)但將「膨脹」選項設定為 false
時發生。status
屬性設定為 415
,type
屬性設定為 'encoding.unsupported'
,而 charset
屬性會設定為不支援的編碼。
此錯誤會在請求包含中介軟體無法剖析的實體時發生。status
屬性設定為 400
,type
屬性設定為 'entity.parse.failed'
,而 body
屬性設定為剖析失敗的實體值。
此錯誤會在請求包含無法通過已定義 verify
選項驗證的實體時發生。status
屬性設定為 403
,type
屬性設定為 'entity.verify.failed'
,而 body
屬性設定為驗證失敗的實體值。
此錯誤會在主體讀取完成前,請求被用戶端中止時發生。received
屬性會設定為請求中止前接收到的位元組數,而 expected
屬性會設定為預期的位元組數。status
屬性設定為 400
,而 type
屬性設定為 'request.aborted'
。
此錯誤會在請求主體大小超過「限制」選項時發生。limit
屬性會設定為位元組限制,而 length
屬性會設定為請求主體長度。status
屬性設定為 413
,而 type
屬性設定為 'entity.too.large'
。
當要求的長度與 Content-Length
標頭中的長度不符時,將會發生此錯誤。這通常發生在要求格式錯誤時,特別是當 Content-Length
標頭是根據字元而非位元組計算時。status
屬性設為 400
,type
屬性設為 'request.size.invalid'
。
當在這個中間軟體之前呼叫稱為 req.setEncoding
的方法時,將會發生此錯誤。這個模組僅直接在位元組上執行,使用這個模組時無法呼叫 req.setEncoding
。status
屬性設為 500
,type
屬性設為 'stream.encoding.set'
。
當這個中間軟體嘗試讀取要求時,如果要求不再可讀取,將會發生此錯誤。這通常表示這個模組中的中間軟體以外的其他東西已經讀取了要求主體,而且中間軟體也設定為讀取相同的請求。status
屬性設為 500
,type
屬性設為 'stream.not.readable'
。
當要求的內容超過 urlencoded
剖析器的設定 parameterLimit
時,將會發生此錯誤。status
屬性設為 413
,type
屬性設為 'parameters.too.many'
。
當要求在 Content-Type
標頭中具有字元集參數,但 iconv-lite
模組不支援它或剖析器不支援它時,將會發生此錯誤。字元集包含在訊息中以及 charset
屬性中。status
屬性設為 415
,type
屬性設為 'charset.unsupported'
,charset
屬性設為不支援的字元集。
當請求包含不支援的編碼之 Content-Encoding
標頭時,將會發生此錯誤。編碼包含在訊息中,也包含在 encoding
屬性中。status
屬性設為 415
,type
屬性設為 'encoding.unsupported'
,而 encoding
屬性則設為不支援的編碼。
此範例示範如何將通用 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 搭配 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' }))