使用 Node.js 获取 HTTP 请求的正文数据
这是在请求正文中提取以 JSON 格式发送的数据的方式。
如果使用的是 Express,则非常简单:使用 body-parser
Node.js 模块。
例如,获取此请求的正文:
const axios = require('axios')
axios.post('http://nodejs.cn/todos', {
todo: '做点事情'
})
这是对应的服务器端代码:
const bodyParser = require('body-parser')
app.use(
bodyParser.urlencoded({
extended: true
})
)
app.use(bodyParser.json())
app.post('/todos', (req, res) => {
console.log(req.body.todo)
})
如果不使用 Express 并想在普通的 Node.js 中执行此操作,则需要做多一点的工作,因为 Express 抽象了很多工作。
要理解的关键是,当使用 http.createServer()
初始化 HTTP 服务器时,服务器会在获得所有 HTTP 请求头(而不是请求正文时)时调用回调。
在连接回调中传入的 request
对象是一个流。
因此,必须监听要处理的主体内容,并且其是按数据块处理的。
首先,通过监听流的 data
事件来获取数据,然后在数据结束时调用一次流的 end
事件:
const server = http.createServer((req, res) => {
// 可以访问 HTTP 请求头
req.on('data', chunk => {
console.log(`可用的数据块: ${chunk}`)
})
req.on('end', () => {
//数据结束
})
})
因此,若要访问数据(假设期望接收到字符串),则必须将其放入数组中:
const server = http.createServer((req, res) => {
let data = []
req.on('data', chunk => {
data.push(chunk)
})
req.on('end', () => {
JSON.parse(data).todo // '做点事情'
})
})