簡體   English   中英

Express.js - 獲取實際發布請求的正文 JSON

[英]Express.js - get the actual post request's body JSON

我正在嘗試在 express.js 中獲取實際的請求正文 JSON。 但是沒辦法。 我在互聯網上找到的只是如何獲取ReqBody類型的ReqBody ,但我想要實際的 JSON,或者更可取的是,一種從 ReqBody 查詢字段的方法。 (在線顯示body.usernamebody.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.bodyreq.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM