当前位置:首页 > 科技  > 软件

Body-Parser:一个格式化请求体数据的 Express 三方库

来源: 责编: 时间:2024-02-29 14:43:45 261观看
导读body-parser 是 Express 中用于格式化请求体数据的一个三方库。以下是一个 body-parser 的常用使用案例。const express = require('express')const bodyParser = require('body-parser')const app = express()// par

body-parser 是 Express 中用于格式化请求体数据的一个三方库。JxT28资讯网——每日最新资讯28at.com

以下是一个 body-parser 的常用使用案例。JxT28资讯网——每日最新资讯28at.com

const express = require('express')const bodyParser = require('body-parser')const app = express()// parse application/x-www-form-urlencodedapp.use(bodyParser.urlencoded({ extended: false }))// parse application/jsonapp.use(bodyParser.json())app.use(function (req, res) {  res.setHeader('Content-Type', 'text/plain')  res.write('you posted:/n')  res.end(JSON.stringify(req.body, null, 2))})

以上代码设置的含义是:项目中所有 Content-Type 是 "application/x-www-form-urlencoded" 或 "application/json" 请求数据都会经过 body-parser 中间件的处理,并设置到 req.body 属性上。JxT28资讯网——每日最新资讯28at.com

下面就来详细介绍 body-parser 的安装和使用。JxT28资讯网——每日最新资讯28at.com

安装

$ npm install body-parser

使用也比较简单。JxT28资讯网——每日最新资讯28at.com

const bodyParser = require('body-parser')

我们是通过调用 bodyParser 对象的方法来获取不同 Content-Type 的数据处理能力的。下面就来介绍。JxT28资讯网——每日最新资讯28at.com

API

bodyParser 上一共提供了 4 个方法来使用,分别对应 4 种不同类型的请求体数据。JxT28资讯网——每日最新资讯28at.com

  1. bodyParser.json([options])
  2. bodyParser.urlencoded([options])
  3. bodyParser.text([options])
  4. bodyParser.raw([options])

其中前 2 种是我们最常使用的。接下来分别介绍。JxT28资讯网——每日最新资讯28at.com

bodyParser.json([options])

返回能解析 json 数据的中间件,默认匹配 Content-Type 值为 "application/json"(可以通过 options.type 进行控制)。接受任何 Unicode  编码的请求体数据,而且还支持 gzip 和 deflate 压缩算法的自动解压。JxT28资讯网——每日最新资讯28at.com

解析好的请求体数据会放在 req.body 属性上,无请求体数据则返回一个空对象({})。JxT28资讯网——每日最新资讯28at.com

Options 选项

这是一个可选参数,不传入则使用默认选项。其他 3 个方法与此类似,在此讲 1 遍后,如果没有特殊情况,后面就不再赘述了。JxT28资讯网——每日最新资讯28at.com

  • type:默认值是 "application/json",表示这个中间件默认匹配的 Content-Type 是 "application/json",这个字段除了接收字符串,还支持接收对象和数组。你也可以自定义,比如设置成 "*/json"(内部是使用 type-is[1] 做匹配的)
  • inflate:是否开启自动解压请求体数据的能力,默认为 true(目前支持 支持 gzip 和 deflate 2 中压缩算法)
  • limit:控制最大请求正文大小,否则报错。默认值是 '100kb'(内部传递给 bytes[2] 库将其解析成字节数进行判断处理)
  • reviver:body-parser 内部默认使用 JSON.parse() 方法将字符串格式化成对象设置到 req.body 上。这个参数就是传递给 JSON.parse() 方法的第 2 个参数,用来自定义解析行为。搞不清楚的同学可以看一下 MDN 上 JSON.parse() 的使用文档[3]
  • strict:默认为 true,用来控制内部 JSON.parse() 所接收的字符串是否只能是对象和数组。设置成 false 时表示可以接受任意类型的字符串数据

bodyParser.urlencoded([options])

默认处理 Content-Type 值为 "application/x-www-form-urlencoded" 的请求体数据。JxT28资讯网——每日最新资讯28at.com

.urlencoded() 中间件还提供了一个布尔参数 urlencoded,用来决定使用哪一个查询解析库来处理请求参数。JxT28资讯网——每日最新资讯28at.com

  • urlencoded为 false 时,内部使用 querystring 库解析
  • urlencoded为 true 时,内部使用 qs 库解析

qs 与 querystring 的区别在于:querystring 只能解析简单 key-value 对,qs 则支持嵌套对象的 key-value 对的解析,后者功能会更加强大。JxT28资讯网——每日最新资讯28at.com

Options 选项

  • urlencoded:以上已介绍过。默认为 true(即使用 qs 解析参数),不过已被弃。官方推荐显式传入一个值,这就需要你了解 qs 和 querystring 之间的区别
  • parameterLimit:控制 URL 编码数据中允许的最大参数数量,默认是 1000。多于这个值,会向客户端返回 413 响应码

bodyParser.text([options])

默认处理 Content-Type 值为 "text/plain" 的请求体数据。JxT28资讯网——每日最新资讯28at.com

Options 选项

  • defaultCharset:如果请求头中的 Content-Type 头中没有指定字符集,则使用这个字段所指定的文本内容的默认字符集。默认为 "utf-8"。

bodyParser.raw([options])

默认处理 Content-Type 值为 "application/octet-stream" 的请求体数据。JxT28资讯网——每日最新资讯28at.com

不支持 multipart/form-data

body-parser 并不支持处理 Content-Type 是 "multipart/form-data" 的请求体数据。如果你有这方面的需求,可以参照下面的库进行选择。JxT28资讯网——每日最新资讯28at.com

  • busboy[4] 和 connect-busboy[5]
  • multiparty[6] 和 connect-multiparty[7]
  • formidable[8]
  • multer[9]

express 已内置 body-parser

express 从 v4.17.0 开始[10],已全面内置了 body-parser 功能,你直接可以通过 express().json() / express().raw()/express().text()/ express().urlencoded() 4 个 API。JxT28资讯网——每日最新资讯28at.com

在内部,这 4 方法其实是 body-parser 借着 express 暴露出来[11]的。也就是说项目中你无需安装 body-parser 依赖了。JxT28资讯网——每日最新资讯28at.com

const bodyParser = require('body-parser')/** * Expose middleware */exports.json = bodyParser.jsonexports.query = require('./middleware/query');exports.raw = bodyParser.rawexports.text = bodyParser.textexports.urlencoded = bodyParser.urlencoded

总结

本文介绍了 Express 中用于解析请求体数据的中间件 body-parser。 其实 Express 在 v4.17.0 中已完整内置了 body-parser 的能力,你可以通过 express() 上的 .json()/.urlencoded()/.text()/.raw() 方法访问到。JxT28资讯网——每日最新资讯28at.com

就介绍到这里了,希望本文对你有所帮助,感谢阅读,再见。JxT28资讯网——每日最新资讯28at.com

参考资料

[1]type-is: https://www.npmjs.org/package/type-is#readmeJxT28资讯网——每日最新资讯28at.com

[2]bytes: https://www.npmjs.com/package/bytesJxT28资讯网——每日最新资讯28at.com

[3]MDN 上 JSON.parse() 的使用文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameterJxT28资讯网——每日最新资讯28at.com

[4]busboy: https://www.npmjs.org/package/busboy#readmeJxT28资讯网——每日最新资讯28at.com

[5]connect-busboy: https://www.npmjs.org/package/connect-busboy#readmeJxT28资讯网——每日最新资讯28at.com

[6]multiparty: https://www.npmjs.org/package/multiparty#readmeJxT28资讯网——每日最新资讯28at.com

[7]connect-multiparty: https://www.npmjs.org/package/connect-multiparty#readmeJxT28资讯网——每日最新资讯28at.com

[8]formidable: https://www.npmjs.org/package/formidable#readmeJxT28资讯网——每日最新资讯28at.com

[9]multer: https://www.npmjs.org/package/multer#readmeJxT28资讯网——每日最新资讯28at.com

[10]从 v4.17.0 开始: https://expressjs.com/en/4x/api.html#express.jsonJxT28资讯网——每日最新资讯28at.com

[11]body-parser 借着 express 暴露出来: https://github.com/expressjs/express/blob/4.18.2/lib/express.js#L78JxT28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75357-0.htmlBody-Parser:一个格式化请求体数据的 Express 三方库

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 详解渗透测试和漏洞扫描的开源自动化解决方案

下一篇: 如何在Rust中操作JSON,你学会了吗?

标签:
  • 热门焦点
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
Top