使用 Node 獲取 HTTP 請求的請求體數據

了解如何使用 Node 通過 HTTP 請求體提取發送的 JSON 數據。 這是如何提取請求體中作為 JSON 發送的數據。 如果你使用的是 Express,那就非常簡單:使用 body-parser Node 模塊。 例如,要獲取此請求的請求體: const axios = require('axios') axios.post('/todos', { todo: '購買牛奶', }) 這是對應的服務器端代碼: const bodyParser = require('body-parser') app.use( bodyParser.urlencoded({ extended: true, }) ) app.use(bodyParser.json()) app.post('/endpoint', (req, res) => { console.log(req.body.todo) }) 如果你沒有使用 Express,而是想在原生的 Node 中實現這個功能,當然需要更多的工作,因為 Express 為你抽象了很多內容。 關鍵的是,當你使用 http.createServer() 初始化 HTTP 服務器時,回調函數被調用時,服務器已經獲取了所有的 HTTP 標頭,但是沒有請求體。 在連接的回調中,傳遞的 request 對象是一個流。 因此,我們需要監聽請求體內容被處理的事件,並且它以塊的形式進行處理。 我們首先通過監聽流的 data 事件來獲取數據,在數據結束時,流的 end 事件被調用一次: const server = http.createServer((req, res) => { // 我們可以訪問 HTTP 標頭 req....

在Express中如何獲取解析後的body和原始body

了解如何在Express中使用body-parser獲取解析後的body和原始body。 在我正在構建的某個應用程序中,我遇到了這個問題。 使用Express,我可以導入body-parser來將body解析為JSON: import bodyParser from 'body-parser' app.use(bodyParser.json()) 然而,為了與Stripe支付API集成,我需要將原始body(未解析)暴露給一個端點,但我無法找出如何在解析body為JSON的同時實現這一點。 下面的代碼可以解決這個問題: app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf } })) 現在可以通過req.rawBody獲取原始body,並且通過req.body獲取JSON解析後的數據。 從body-parser的GitHub上我發現,這將使每次請求的RAM使用量翻倍,但由於我需要這個功能,我別無選擇。 除非為我想處理的Stripe webhook創建一個不同的伺服器。