了解如何使用Node提取通过HTTP请求体作为JSON发送的数据
下面是如何提取在请求体中作为JSON发送的数据。
如果你使用Express,这很简单:使用body-parser Node模块。
例如,要获得这个请求的主体。
const axios = require('axios')
axios.post('/todos', {
todo: 'Buy the milk',
})
这就是匹配的服务器端代码。
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,并且你想在vanilla Node中这样做,你需要做更多的工作,当然,因为Express为你抽象了很多东西。
需要理解的关键是,当你使用http.createServer() 初始化 HTTP 服务器时,当服务器得到所有的 HTTP 头信息,但不是请求正文时,回调就会被调用。
在连接回调中传递的request 对象是一个流。
所以,我们必须监听要处理的正文内容,而且是分块处理。
我们首先通过监听流data 事件来获取数据,当数据结束时,流end 事件被调用,一次。
const server = http.createServer((req, res) => {
// we can access HTTP headers
req.on('data', (chunk) => {
console.log(`Data chunk available: ${chunk}`)
})
req.on('end', () => {
//end of data
})
})
所以为了访问数据,假设我们期望收到一个字符串,我们必须把它放入一个数组。
const server = http.createServer((req, res) => {
let data = []
req.on('data', (chunk) => {
data.push(chunk)
})
req.on('end', () => {
JSON.parse(data).todo // 'Buy the milk'
})
})