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插件的效果,虽然不是很全面,但是中间件的一些原理,使用是一样的。

分类: Node 标签: nodeexpress自定义中间件

评论

暂无评论数据

暂无评论数据

目录