当前位置: 首页 > news >正文

湛江市建设交易中心网站深圳市龙华区地图

湛江市建设交易中心网站,深圳市龙华区地图,c 网站开发 readonly属性,哪家网站推广好raw-body是什么 raw-body的主要功能是处理HTTP请求体的原始数据。它提供了以下核心功能#xff1a; 解析请求体#xff1a;可以从HTTP请求中提取原始数据#xff0c;包括文本和二进制数据。配置选项#xff1a;通过配置项#xff0c;可以设置请求体的大小限制、编码方式…raw-body是什么 raw-body的主要功能是处理HTTP请求体的原始数据。它提供了以下核心功能 解析请求体可以从HTTP请求中提取原始数据包括文本和二进制数据。配置选项通过配置项可以设置请求体的大小限制、编码方式等参数。异常处理模块能够处理异常情况如请求体超出限制。编码转换支持将原始数据解码为指定编码的字符串或者返回Buffer实例。 express中的body-parser中间件就使用了raw-body来处理请求 raw-body基础用法 安装 npm install raw-body 引入 var getRawBody require(raw-body) getRawBody函数签名如下 getRawBody(stream, [options], [callback]) stream是需要解析的流。 options是一些配置项。 length - 流的长度。limit - 请求体的大小限制。比如 1000 、 500kb 或 3mb 。encoding - 用于将请求体解码为字符串的编码。默认情况下如果未指定编码将返回 Buffer 实例。最有可能的是您需要 utf-8 因此将 encoding 设置为 true 将解码为 utf-8 callback是解析完成之后的回调函数。 结合express一起使用的例子如下 var contentType require(content-type) var express require(express) var getRawBody require(raw-body)var app express()app.use(function (req, res, next) {getRawBody(req, {length: req.headers[content-length],limit: 1mb,encoding: contentType.parse(req).parameters.charset}, function (err, string) {if (err) return next(err)req.text stringnext()}) })// 可以在后续的express中间件中访问 req.text也可以使用promise风格调用getRawBody var getRawBody require(raw-body) var http require(http)var server http.createServer(function (req, res) {getRawBody(req).then(function (buf) {res.statusCode 200res.end(buf.length bytes submitted)}).catch(function (err) {res.statusCode 500res.end(err.message)}) })server.listen(3000)raw-body v0.0.3源码阅读 我们选择的版本是v0.0.3选择这个版本的原因非常简单代码量非常少只有70行 主要作用是处理一些异常当请求体内容超过限制时会调用stream.resume这个方法销毁这个stream防止请求数据被缓冲。监听stream的一些事件然后使用回调进行处理stream之所以能调用on、once、removeListener等方法是因为stream继承了Nodejs中的EventEmitter模块。 data事件每当可读流接收到新的数据块时就会触发data事件。一般用于逐块处理请求体数据。end事件end事件在可读流读取完数据后触发表示数据流结束。error事件当可读流发生错误时触发error事件。close事件close事件在可读流关闭时触发表示流已经被关闭用于在流关闭时进行一些资源清理或收尾工作 onData onData的核心代码只有这两行 吧收到的chunk 放到buffers数组里面chunk的数据类型默认是Buffer类型 然后使用 chunk.length 返回当前chunk的字节数并累加起来 onEnd onEnd的核心是57行调用传入的回调函数并吧Buffer.concat的结果传入 Buffer.concat方法会吧 buffers 中的所有 Buffer 实例连接在一起返回一个新的 Buffer cleanup cleanup中的主要逻辑就是调用removeListener对请求数据流的事件监听器进行清理可以防止内存泄漏以及不必要的资源占用。 v0.0.3版本的代码看完之后我们再看看看v2.5.2的 raw-body v2.5.2源码阅读 2.5.2版本的代码有300多行是0.0.3版本的四倍不过核心功能是差不多的差异点如下 options配置项新增了encoding参数用于吧body解码成指定编码的字符串默认情况下如果没有指定编码将返回一个 Buffer 实例stream增加了aborted事件的处理stream.on(aborted, onAborted) raw-body依赖的模块 2.5.2版本依赖了5个npm模块 先看一下这些模块的功能 bytes 是一个用于在不同单位之间进行字节转换的Nodejs模块。常用方法如下 bytes.parse(1KB);// output: 1024 bytes.format(1024);// output: 1KBhttp-errors 用于创建HTTP错误对象。它简化了处理HTTP请求时生成错误响应的过程。也可以和ExpressKoaConnect一起使用。用法如下 var createError require(http-errors) var express require(express) var app express()app.use(function (req, res, next) {if (!req.user) return next(createError(401, Please login to view this page.))next() })iconv-lite 用于处理字符编码的转换。可以在不同的字符编码之间进行转换。 const iconv require(iconv-lite); const originalText 你好世界;// 将文本编码为 Buffer const encodedBuffer iconv.encode(originalText, utf-8); // 将编码后的 Buffer 解码为文本 const decodedText iconv.decode(encodedBuffer, utf-8);unpipe 用于取消可读流Readable Stream和可写流Writable Stream之间的数据传输。例如从文件读取流到HTTP响应流。unpipe 库允许你取消这种数据传输。 getRawBody是入口函数我们一起看一下 针对参数做一些验证以及错误处理调用bytes模块的parse方法解析传入的limit参数调用readStream函数处理stream这里做了判断如果传入了回调函数则使用回调的方式传递解析之后stream否则使用promise风格来处理 readStream函数和v0.0.3版本的代码变化不太大 调用getDecoder函数用于获取指定编码的解码器。而getDecoder函数里面又调用了iconv模块的getDecoder方法监听stream的aborted事件当客户端中止 HTTP 请求时可读流会触发 aborted 事件。比如在请求尚未完成时客户端提前关闭了连接。 onAborted函数如下 核心逻辑就是调用createError创建一个错误信息然后调用done函数。 done函数是readStream里面需要重点关注的函数代码如下 1将complete标记为true表示这个流已经处理完了。 2判断done函数的调用环境如果是在同步代码块则使用process.nextTick延迟invokeCallback函数的调用。 done函数同步调用是在这几个地方 异步调用则是在stream.on事件的几个回调函数中并在212行标记为异步 3根据done函数第一个参数判断是否有错误如果有错误则调用halt方法处理streamhalt 方法会提前结束stream的读取操作。 halt函数内容如下 unpipe(stream) 会断开与这个流相关的其他管道如果有其他流正在处理 stream 输出的数据这些流不会收到来自 stream 的数据。 pause 方法是 Nodejs 可读流的一个方法用于将流暂停停止触发 data 事件不再传递数据。 总结 本文我们了解了raw-body的简单使用raw-body模块也是Nodejs生态中使用的很频繁的一个模块通过对v0.0.3和v2.5.2版本源码的解析也了解了内部实现。 参考资料 https://github.com/stream-utils/raw-body https://nodejs.cn/dist/latest-v18.x/docs/api/stream.html https://nodejs.cn/dist/latest-v18.x/docs/api/buffer.html
http://www.sadfv.cn/news/99955/

相关文章:

  • 在网站做淘宝推广免费网站商城建设
  • 黑客怎么攻击网站深圳外贸公司招聘信息
  • 网站开发过程中出现的问题徐州网站设计师
  • 做牛排的网站北京模板建站设计
  • 购物网站首页图片网站建设之婚礼摄影网站设计
  • 网上做图赚钱的网站seo优化软件下载
  • 为何网站需改版嘉兴关键词优化报价
  • 沧州企业网站建设宿迁房价
  • 行业应用服务类appwin10系统优化软件
  • 哪里能做网站优化关键词排名公司
  • 蒙古文网站建设wordpress动漫视频网站
  • 网站建设毕业设计游戏发号网站源码
  • 网站空间 .de公众平台的微信网站开发
  • 建设部网站城建学院北京住房与城乡建设厅网站首页
  • 银川网站制作企业组网设计
  • 网站建设 百度文库网站建设与推广策划书
  • 网站搭建合作协议四川省建设部网站
  • 安徽省城乡和建设厅网站广告招牌图片大全
  • 外贸建站cms有哪个网站做正品港货
  • 南通专业做网站公司wordpress博客一直发布失败
  • 怎么自己创建一个网站手机做网站用的一些素材
  • 手机网站应该怎么做上海做oocl船的公司网站
  • 开封网站开发主图详情页模板
  • 房产中介网站建设的目的wordpress发布时间
  • 深圳网站建设_庆阳市住房和城乡建设局网站
  • 网站制作网络推广关键词排名深圳做网站 龙华信科
  • 中国网通做网站软件开发主要是做什么
  • 哪个公司建网站最好网站备案最快多久
  • 深圳市做门窗网站有哪些推广家私网站栏目和功能需求策划
  • 文创产品设计方法seo关键词是什么