[英]Express.js - get the actual post request's body JSON
我正在嘗試在 express.js 中獲取實際的請求正文 JSON。 但是沒辦法。 我在互聯網上找到的只是如何獲取ReqBody
類型的ReqBody
,但我想要實際的 JSON,或者更可取的是,一種從 ReqBody 查詢字段的方法。 (在線顯示body.username
和body.password
但其他字段名稱呢?我不能只傳遞字段名稱foo
並嘗試獲取body.foo
。
這是我到目前為止所得到的:
router.post('/', function (req, res, next){
let body = req.body;
//?????
});
如果您的帖子正文的內容類型是 JSON,那么您可以這樣做:
router.post('/', express.json(), function (req, res, next){
console.log(req.body);
// use req.body and send a response here
});
更常見的是,您會在更高級別配置express.json()
以便它適用於該路由器上的所有路由,甚至將其放在app
對象上以便它也適用於所有路由器:
router.use(express.json());
router.post('/', function (req, res, next){
console.log(req.body);
// use req.body and send a response here
});
express.json()
中間件將檢查表示 JSON 的內容類型,如果匹配,它將從傳入的流中讀取帖子的正文,解析在那里找到的 JSON 並將生成的 Javascript 對象放入req.body
。 req.body
。 客戶端放入與 Post 一起發送的 JSON 中的任何字段都將在req.body
。
如果您沒有意識到,默認情況下 Express 不會從傳入流中讀取 POST 請求的正文。 它留在操作系統或 nodejs 網絡緩沖區中。 因此,在某些代碼從傳入流中讀取主體並對其進行解析之前, req.body
什么都沒有。 通常,您會安裝諸如express.json()
、 express.text()
或express.urlencoded()
等中間件或其他一些自定義中間件,並且每個中間件都會查看內容類型,如果它與他們知道如何解析的內容相匹配,然后他們從流中讀取主體,解析它並用它做一些事情(比如把它放在req.body
)。 其他中間件如 multer 可以從正文中讀取一個或多個上傳的文件。 對於許多類型的內容類型,有許多類型的中間件。
如果你真的想要原始的、未解析的主體(如果它是 JSON 則不需要),那么你可以使用中間件express.raw()
。 express.raw() 的不同之處在於它從流中讀取主體,但不解析它,因此如果您使用該主體,它將采用任何內容類型並將原始數據作為 Buffer 對象放入req.body
. 無論你做什么,都不要首先使用它,因為它會讀取所有主體,而其他中間件將永遠不會得到任何東西。 通常,如果您正在使用那個,您將在特定於請求處理程序的基礎上使用它,而不是作為通用中間件。
是的,但 ReqBody 是預定義的,因為它不是原始 JSON。 這就是為什么我要問如何獲取原始 json
您對由express.json()
中間件解析的 JSON 的req.body
存在誤解。 它將包含傳入 JSON 包含的任何屬性。 這 100% 由客戶端和它發送的 JSON 決定,根本不是由某個類預先確定的。 如果客戶端在此 JSON {'foobar':true}
發送名為foobar
的屬性,並且您在該傳入請求上運行express.json()
中間件,則req.body.foobar
將包含值true
。
正如我上面解釋的,您可以使用中間件express.raw()
將 RAW JSON 轉換為Buffer
對象(然后您必須自己解析它),但這不是express.json()
中間件所必需的會為你做這一切。
僅供參考,nodejs 源代碼或 Express 源代碼中似乎都沒有對名為ReqBody
的類的任何引用。 似乎有人使用它作為引用req.body
對象的快捷方式,而不是這里使用的某個類。
嘗試使用正文解析器body-parser github
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.