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属性就可以得到请求数据
})