使用 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 // '做点事情'
  })
})