Express框架 数据解析
get的请求数据可以直接同request对象的query属性获取,post呢?
简单点来说我们需要用到一个插件(中间件):body-parser
安装
npm install body-parser
使用
const express = require("express");
const bodyParser = require("body-parser");
var server = express();
server.listen(8080);
server.use(bodyParser.urlencoded({
extended: false, //扩展模式
limit: 2 * 1024 * 104 //限制2m大小
}));
server.use('/', (req, res) => {
console.log(req.body); //post数据
})
如果需要获取到post数据,需要先use调用一次中间件方法,并且他还有两个参数,一个是extended扩展模式,一般为false,还有一个是limit限制数据的大小
然后在后面的use中,我们可以获取到req下的body属性,这个属性默认是没有的,是使用了中间件才产生的。
这就产生了一个链式操作
链式操作
每个监听请求的函数,上一章讲了有三个,get、post、use,他们会有除了requset、response还有第三个参数next,这个参数是可选的,可以自由觉得是否需要进行链式操作。
链式操作还有一个前提,就是他们的路径是要一样的:
server.use("/a",(req,res,next)=>{
});
server.use("/b",(req,res,next)=>{
})
这两个路径都不一样,是无法产生链式操作的,一样才行。
那么什么是链式操作呢?
也就是上一个use处理好后,我下一个use可以在上一个use的基础上再操作。形成工作链。
server.use("/a",(req,res,next)=>{
next();
});
server.use("/a",(req,res,next)=>{
next();
})
我们可以通过自己判断是否调用next方法来实现,是否进行下一步,这样,上一步发生错误,可以及时停止。
那么bodyParser获取到所有路径呢?
server.use((req,res,next)=>{
next();
});
只传一个函数,会在所有路径请求里运行函数。
自定义一个中间件
创建一个query.js文件
const querystring = require("querystring");
module.exports = {
quire : funciton(){
return function(req,res,next){
let str = "";
//监听数据
req.on("data",()=>{
str += data;
});
//数据完毕
req.on("end",()=>{
req.body = querystring.parse(str);
next();
});
}
}
}
注意一点就是,通过form表单的post传过来的参数是:xxx=xxx&xxx=xxx
的格式,如果是其他插件,如axios的post,传过来的可能就是一个json格式的字符串,可以直接JSON.parse()解析成对象,而不用querystring插件。
使用这个中间件
const my-params = require("./query"); //注意路径问题
const express = require("express");
var server = express();
server.listen(8080);
server.use(my-params.quire());
server.user('/',(req,res)=>{
console.log(req.body);
});
这样我们也可以做到bodyParser插件的效果,虽然不是很全面,但是中间件的一些原理,使用是一样的。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据