使用 Node.js 获取 HTTP 请求的正文数据

这是在请求正文中提取以 JSON 格式发送的数据的方式。

如果使用的是 Express,则非常简单:使用 body-parser Node.js 模块。

例如,获取此请求的正文:

JS
const axios = require('axios')
axios.post('http://nodejs.cn/todos', {
todo: '做点事情'
})

这是对应的服务器端代码:

JS
const express = require('express')
const app = express()
app.use(
express.urlencoded({
extended: true
})
)
app.use(express.json())
app.post('/todos', (req, res) => {
console.log(req.body.todo)
})

如果不使用 Express 并想在普通的 Node.js 中执行此操作,则需要做多一点的工作,因为 Express 抽象了很多工作。

要理解的关键是,当使用 http.createServer() 初始化 HTTP 服务器时,服务器会在获得所有 HTTP 请求头(而不是请求正文时)时调用回调。

在连接回调中传入的 request 对象是一个流。

因此,必须监听要处理的主体内容,并且其是按数据块处理的。

首先,通过监听流的 data 事件来获取数据,然后在数据结束时调用一次流的 end 事件:

JS
const server = http.createServer((req, res) => {
// 可以访问 HTTP 请求头
req.on('data', chunk => {
console.log(`可用的数据块: ${chunk}`)
})
req.on('end', () => {
//数据结束
})
})

因此,若要访问数据(假设期望接收到字符串),则必须将其放入数组中:

JS
const server = http.createServer((req, res) => {
let data = '';
req.on('data', chunk => {
data += chunk;
})
req.on('end', () => {
JSON.parse(data).todo // '做点事情'
})
})