中间件 body-parser 原理分析(手写bodyParse))

1、原理分析

从上面的使用案例我们可以分析出一下几点:

  • 首先,body-parser 中间件的作用是给 req 添加属性 body,值为对象,以键值对的形式存储请求体中的参数;

  • 其次,body-parser 只处理 POST 请求;

  • 最后,body-parser 模块导出一个对象,上面有两个方法 urlencoded 和 json,分别处理表单提交和 json 格式的请求体参数。

2、分析 urlencoded、json 公共逻辑

在实现之前我们先分析一下两个方法,首先都需要先读取请求体中的内容,数据传输的类型为 Buffer,转换成字符串后会根据提交方式不同而导致请求体中的内容是查询字符串或者是 json 字符串的区别。

当解析失败时都需要做错误处理,当不是 POST 请求时都需要向下执行其他中间件,而最核心的事就是把请求体中的数据转换成对象挂在 req.body 上。

使用的转换数据的方法不同是唯一的区别,能区分两者的就是请求头 Content-Type 的值,因此我们可以把所有的公共逻辑抽取出来用一个 acceptPost 函数来执行。

3、模块的创建

我们下面创建自己的 body-parser 模块,防止命名冲突,我们的模块命名为 my-body-parser,处理参数需要使用 querystring 和 qs 两个模块,其中 qs 是第三方模块,使用前需安装。

npm install qs

qs 和 querystring 作用基本相同,就是处理查询字符串格式的参数,但是也有一点小小的区别,querystring 只能处理一级,而 qs 可以处理多级。

在把基本模块搭建好后,我们下面就实现 body-parser 模块内的公共逻辑函数 acceptPost

4、acceptPost 的实现

为了兼容 urlencoded 方法和 json 方法设计了两个参数,一个是区分当前调用方法的 type,一个是针对 urlencoded 方法的 options

// acceptPost 的实现

// urlencoded 方法和 json 方法的公共逻辑函数

function acceptPost(type, options) {

// 返回一个中间件函数

return function (req, res, next) {

// 获取请求头

let contentType = req.headers[“content-type”];

// 判断如果不符合两种提交的请求头直接交给其他中间件处理

if (

contentType === “application/x-www-form-urlencoded” ||

contentType === “application/json”

) {

// 存储数据的数组

let buffers = [];

req.on(“data”, function (data) {

// 接收数据并存入数组中

buffers.push(data);

});

req.on(“end”, function () {

// 组合数据并转换成字符串

let result = Buffer.concat(buffers).toString();

// 处理数据并挂载 req.body 属性上

// 如果是表单提交则使用 querystring 或 qs,否则使用 JSON.parse

if (type === “form”) {

// 如果配置 extended 值为 true 使用 qs,否则使用 querystring

req.body = options.extended ? qs.parse(result) : querystring.parse(result);

} else if(type === “json”) {

req.body = JSON.parse(result);

}

next(); // 向下执行

});

// 错误处理

req.on(“err”, function (err) {

next(err);

});

} else {

next();

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

资料领取方式:点击这里免费领取前端全套学习资料

css源码pdf

JavaScript知识点
作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

资料领取方式:点击这里免费领取前端全套学习资料

[外链图片转存中…(img-7OspfmFE-1713641050044)]

[外链图片转存中…(img-Mp4cfjv4-1713641050044)]

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值