Bootstrap

中间件 body-parser 原理分析(手写bodyParse)),2024年最新大厂面试官

  • 首先,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”) {

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

总结
  • 对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。

  • 算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈…(最好多刷一刷,不然影响你的工资和成功率???)

  • 在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

  • 要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!

第一次跳槽十分忐忑不安,和没毕业的时候开始找工作是一样的感受,真的要相信自己,有条不紊的进行。如果有我能帮忙的地方欢迎随时找我,比如简历修改、内推、最起码,可以把烦心事说一说,人嘛都会有苦恼的~

祝大家都有美好的未来,拿下满意的 offer。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

苦恼的~

祝大家都有美好的未来,拿下满意的 offer。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-j6ZFxUbJ-1712738725317)]

;