使用Node获取HTTP请求体数据的方法

578 阅读1分钟

了解如何使用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'
  })
})