/

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

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

了解如何使用 Node 通過 HTTP 請求體提取發送的 JSON 數據。

這是如何提取請求體中作為 JSON 發送的數據。

如果你使用的是 Express,那就非常簡單:使用 body-parser Node 模塊。

例如,要獲取此請求的請求體:

1
2
3
4
5
const axios = require('axios')

axios.post('/todos', {
todo: '購買牛奶',
})

這是對應的服務器端代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 事件被調用一次:

1
2
3
4
5
6
7
8
9
const server = http.createServer((req, res) => {
// 我們可以訪問 HTTP 標頭
req.on('data', (chunk) => {
console.log(`數據塊可用:${chunk}`)
})
req.on('end', () => {
// 數據結束
})
})

因此,為了訪問數據,假設我們預期接收到的是字符串,我們必須將其放入數組中:

1
2
3
4
5
6
7
8
9
const server = http.createServer((req, res) => {
let data = []
req.on('data', (chunk) => {
data.push(chunk)
})
req.on('end', () => {
JSON.parse(data).todo // '購買牛奶'
})
})

tags: [“http”, “node”, “express”, “body-parser”]