nodejs 中 express 框架body-parser中间件原理解析
1. express 中的 body-parser 中间件
在Express 中没有内置获取表单 post 请求体的API,需要借助中间件的第三方包:body-parser 来获取
安装:
npm install --save body-parser
配置并开启服务:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.post('/post', function (req, res) {
var comment = req.body
console.log(comment)
})
//开启服务器
app.listen(3000, () => {
console.log('success');
});
express 中的 body-parser 中间件 解析获取 post 请求参数:
2. 自己封装 bodyParser中间件
1. 自己封装 bodyParse 中间件
const querystring = require('querystring');
/* 导出中间件(函数)
第一个参数:请求对象
第二个参数:完成回调
* postObject:post请求参数对象
*/
module.exports = (req, res, next) => {
/*如果本次请求是post请求,则解析post请求参数,
并且将解析好的参数对象作为req的属性传递给下一个中间件*/
if (req.method == 'POST') {
//1.1 给req注册一个data事件
let postData = "";
req.on('data', function (chuck) {
postData += chuck;
});
//1.2给req注册一个end事件
req.on('end', function () {
//1.3 使用 querystring模块解析post参数
let postObjc = querystring.parse(postData);
//将解析好的参数对象添加到 req 的属性中
req.body = postObjc;
//执行下一个中间件
next();
});
}
}
2. app.js 测试:自己写的 bodyParse 中间件依然可以 解析获取 post 请求参数
//导入模块
const express = require('express');
//创建服务器
let app = express();
//导入自己写的 bodyParse.js 中间件
app.use(require('./bodyParse.js'));
app.post('/post', function (req, res) {
var comment = req.body
console.log(comment)
})
//开启服务器
app.listen(3000, () => {
console.log('success');
});
3. bodyParser.js 原理解析
- 判断请求为 post 请求,则进行解析。
- 因为是 post 请求,传输数据可能会很大,需要一点一点传。创建 postData 变量,存储在变量里面
- 使用 querystring模块解析post参数
- 将解析好的参数对象添加到req的属性中 req.body
- 执行下一个中间件 next()