express 自定义中间件 处理post请求


前言

express内置的urlencoded()带有兼容问题,那我们用node的querystring 封装一个处理post请求的中间件,方便使用。


一、内置中间件 (常用)

实现代码和笔记

const express = require('express');
const app = express();

// 内置中间件 常用
// express.static() 设置静态目录
// express.json()   接受json 格式的数据 
    // 【数据格式:{id:1,name:"222"},请求头为:application/json】
// express.urlencoded()     处理post表单数据
    // 【数据格式:id=1&name=222 , 请求头为:application/x-www-form-urlencoded】

// 中间件在请求之前,响应之后,要注意使用位置
// 在接受完数据后 ,会将数据的对象形式挂载到req请求对象的body 属性上
// 两个中间件都存在兼容性问题,后续使用的比较少
app.use(express.urlencoded({extended:false})) // extended 的作用是 获取传过来的对象有没有原型的问题
app.use(express.json())
app.post('/',(req, res)=>{
    console.log(req.body);
})
app.listen(3000,()=>{
    console.log("server is running at http://localhost:3000");
})
  • 现在来发送一下请求
    在这里插入图片描述
  • 在后台查看,post请求数据已经解析好了
    在这里插入图片描述

二、封装中间件处理 post请求

1.如何封装

  • 表单数据多数为post进行提交到服务器端。需要监听req对象的data事件(接收请求提交过来的数据的)来获取客户端发送到服务器的数据。如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后分批次发送给服务器。所以data事件可能会被触发多次,每次触发data事件时,收到的数据只是全部数据的一部分,因此需要做数据的拼接才能得到完整的数据:
const querystring = require('querystring');
function postparse (req,res, next){
    let arr = [];  // 数据可能分批次发送,这里定义一个容器
    // 监听data 事件 
    req.on('data',buffer=>{
        arr.push(buffer);   // buffer是每一次传送的数据 分批次放入arr中; 
        console.log(buffer); // buffer 是十六进制数据,不具备可读性
    }) 
    // 传送完毕会触发end事件,监听end 事件
    req.on("end",()=>{
		// Buffer.concat(arr)用于拼接arr中的buffer数据、再tostring转为字符窜
		// 然后querystring.parse()转为对象
        let post = querystring.parse(Buffer.concat(arr).toString())
        // 挂载到req.body上
        req.body = post
         // 继续后续的请求处理(end事件处理是异步的,所以next得写在函数里)
        next();
    }); 
}
module.exports = postparse;
  • 使用一下中间件
// 自定义中间件 本质为函数
// 在整个请求链路中,所有中间件与最终路由共用一份req ,res
const express = require('express');
const postparse = require('./middleware/postparse');
const app = express();
app.use(postparse)
app.post('/',(req,res)=>{
    console.log(req.body);
    res.send('发送成功 ')
})
app.listen(3000,()=>{
    console.log("server is running at  http://localhost:3000" );
})
  • 输出一下buffer 为十六进制数据 先转为字符窜在转为对象,方便调用
    在这里插入图片描述

三、第三方中间件

  • 第三方中间件安装就能用,比较方便

  • 以使用body-parser中间件来接收post数据为例,步骤如下:

  • 安装三方中间件body-parser

  • npm i -S body-parser

  • 应用文件中导入body-parser

  • 通过中间件调用 app.use(body.urlencoded({extended: false}))

  • 在匹配的路由中通过req.body获数post中数据

    • Express内置的express.urlencoded中间件,就是基于body-parser这个第三方中间件进一步封装出来的。但内置的有版本兼容问题,所以一般项目选择安装使用第三方的中间件

在使用的时候,body-parser库的语法与前面看的express内置的express.urlencoded中间件的语法非常相似,原因是内置中间件是基于body-parser来实现的。

  • 使用body-parse
const express = require('express')
const app = express()

// 引入body-parser
const bodyParser = require('body-parser')
// 使用body-parser中间件
app.use(bodyParser.urlencoded({ extended: false }));

app.post('/',(req,res) => {
    console.log(req.body);
    res.send("发送ok")
})

app.listen(3000,() => {
    console.log("Server is running at http://127.0.0.1:3000")
})

在这里插入图片描述

总结

  • 粗浅的封装了一个post请求 的中间件,第三方中间件虽然方便,不过了解一下其大概的原理是有助于记忆和学习的
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值