NodeJS http服务端获取POST请求数据

http服务

我们知道,使用nodejs标准库的http模块创建一个http服务很简单,如下:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

http.createServer传了一个回调函数作为参数,每当一个请求进来时,会产生一个request事件,从而让该回调函数被调用一次,该回调函数接收两个参数,req表示请求对象,res表示响应对象,但是需要注意的是,req对象中包含了http请求的所有请求头,但是却不包含Post请求的数据(request body)。

获取请求数据

那么我们如何得到Post请求的数据呢?事实上,请求数据是以流的方式从客户端(浏览器)传到服务端的,当有数据到达时,req对象会产生一个data事件,当数据传输完毕时,req对象会产生一个end事件,因此,我们只需要将data事件中得到的数据暂时保存起来,当end事件产生时表示数据已经传输完,便可以开始使用得到的请求数据,代码示例如下:

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
    let data = []
    req.on('data', chunk => {
        data.push(chunk)  // 将接收到的数据暂时保存起来
    })
    req.on('end', () => {
        console.log(JSON.parse(data)) // 数据传输完,打印数据的内容
    })
    // res.statusCode = 200;
    // res.setHeader('Content-Type', 'text/plain');
    // res.end('Hello World');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

使用express

如果使用express的话,就非常方便了,可以使用body-parser直接将body数据解析到req对象中:

const bodyParser = require('body-parser')

app.use(
  bodyParser.urlencoded({
    extended: true
  })
)

app.use(bodyParser.json())

app.post('/todos', (req, res) => {
  console.log(req.body)  // 直接通过req对象中的body属性就可以得到请求数据
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章