用户发送信息到微信服务器,然后微信服务器向我们的服务器发送信息,这个信息属于一个流式的数据,我们要写一些方法处理这个数据

  • 我们新建libs文件夹,在文件夹下新建utils.js的文件,这个文件中主要写一些工具方法,比如读取流式数据的方法

接收流式数据

utils.js

module.exports = {getUserDataAsync(req){// 流式文件内容获取return new Promise((resolve,reject) => {let data = ""// 拼接流式文件的数据req.on("data",userData => {// 因为是二进制数据我们需要转化一下data += userData.toString()})req.on("end",() => {// 数据获取完毕resolve(data)})})}}

auth.js

const { getUserDataAsync } = require("../libs/utils")module.exports = () => {return async (req, res, next) => {...if (req.method === "GET") {...} else if (req.method === "POST") {// POST用于接收用户发送的消息...// 获取微信发送的消息const data = await getUserDataAsync(req)}}
}

当我们发送信息进行测试的时候就会发现,他是一个xml文件

<xml><ToUserName><![CDATA[gh_844f522f3f29]]></ToUserName> // 开发者的id<FromUserName><![CDATA[ocnfW5u-VnhOrL3yfy69g1mtod7Q]]></FromUserName> // 用户的openid<CreateTime>1654306028</CreateTime> // 发送的时间戳<MsgType><![CDATA[text]]></MsgType> // 发送的消息类型<Content><![CDATA[微信公众号测试]]></Content> // 发送的内容<MsgId>23683969114016066</MsgId> // 消息id 微信服务器默认保存3天的用户数据
</xml>

解析流式数据

  • 我们需要将上面的xml对象解析成js对象
  • 这里我们就需要用到一个包xml2js 点击,我们主要用到了他的parseString方法
npm install xml2js

utils.js

const {parseString} = require("xml2js")module.exports = {...parseXmlData(xmlData){// 解析xml为js对象return new Promise((resolve,reject) => {parseString(xmlData,{trim:true},(err,data) => {if(!err){resolve(data)}else{reject(err)}})})}
}

auth.js

const { getUserDataAsync, parseXmlData } = require("../libs/utils")module.exports = () => {...if (req.method === "GET") {...} else if (req.method === "POST") {...// 获取微信发送的消息const xml_data = await getUserDataAsync(req)const user_data = await parseXmlData(xml_data)console.log(user_data);}}
}

当我们发送消息的时候经过解析,他是这样的

格式化数据

因为返回的数据还是有点复杂,我们统一格式化一下

utils.js

module.exports = {...formatMsg(data){const result = {}const xmlOjb = data.xmlif (typeof xmlOjb === "object"){for(_key in xmlOjb){const _value = xmlOjb[_key]// MsgId: [ '23683987267420534' ]if(Array.isArray(_value) && _value.length > 0){result[_key] = _value[0]}}}return result}}
const { getUserDataAsync, parseXmlData, formatMsg } = require("../libs/utils")module.exports = () => {return async (req, res, next) => {if (req.method === "GET") {...} else if (req.method === "POST") {...// 获取微信发送的消息const xml_data = await getUserDataAsync(req)let user_data = await parseXmlData(xml_data)user_data = formatMsg(user_data)console.log(user_data);}}
}

当我们发送消息的时候经过格式化,他是这样的

微信公众号开发之流式数据读取相关推荐

  1. 微信公众号开发时返回中文数据为问号解决方法

    最近在入门微信公众号开发时,发现从微信服务器获取的数据返回到前端时,中文都会变成 ?.百度后,发现很多解决方法都没什么作用,但还是找到了两个可以解决的办法. 一.使用HttpServletRespon ...

  2. 关于开发微信公众号获取手机用户运动数据的功能实现思路

    一.前沿研究 微信公众号开发文档,浏览后没有任何关于获取微信运动数据的接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp144 ...

  3. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  4. 微信公众号开发系列-玩转微信开发-目录汇总

    引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习.致正在奔跑的您! 在现在这个无处不在的互联网背景下,各种应用已不再仅仅局限于网页或桌面应用了,IOS. ...

  5. 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发

    好久没有发过博文了,恰好这两天做了一个关于微信公众号开发的东东,拿出来和大家分享一下. 需要做一套微信签到.抽奖系统,我要在后台存储微信用户的相关信息,openIDNickname之类的信息.在开发前 ...

  6. 微信公众号开发-----实现模板、图文、文本、音乐、图片推送

    本篇文章实现模板.图文.文本.音乐.图片推送,前提是已经搭建了微信开发环境.读完本文后,实现的主要效果如下 在测试账号中配置模板 登录测试公众号/正式公众号(认证后的服务号),测试公众号:模板消息接口 ...

  7. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下jsapi支付,场景就是在微信内打开某个页面,完成在线支付,同样一个网页,使用微信打开就是js ...

  8. 微信公众号开发(一) -- 自定义菜单 动态菜单

    简单修改一下appid.appsecret 代码可直接复制使用 自定义菜单 //获取token值 $appid = ''; //微信支付申请对应的公众号的APPID $appsecret = ''; ...

  9. 微信公众号开发 (3) 菜单处理

    一.前言 微信公众号开发 (1) 微信接入认证成为开发者 微信公众号开发 (2) 消息处理 本文将实现 根据AppID和AppSecret获取access_token 自定义菜单(创建菜单.查询菜单. ...

最新文章

  1. java poi 导出 国际化_更好用的excel国际化多语言导出
  2. python之IO操作
  3. VDI序曲九 实战体验Remote FX(重磅推荐)
  4. 【算法】学习笔记(0):算法初探(逻辑抽象 + 示例 + 代码实现)
  5. c语言中如何用程序判断double型的浮点数能精确到几位小数,C语言中浮点数double/float相等判断...
  6. myeclipse不是eclipse,servlet 报错 HttpServlet cannot be resolved to a type
  7. xml 中插入html代码
  8. linux 脚本 变量为空,Shell判断一个变量是否为空
  9. java共享内存_Java共享内存
  10. iOS开发--Swift RAC响应式编程初探
  11. 竞选计算机协会网络部部长,计算机协会部长竞选演讲稿
  12. win10磁盘管理教程
  13. pandas(一) Series和DataFrame
  14. 纳德拉:Windows Phone市场份额虽低 但它“完整了体验”
  15. linux 帝国cms 刷新,帝国cms怎么自动刷新网站首页?(帝国CMS自动刷新首页的方法)...
  16. Vue+ant-design-pro(2)动态路由
  17. 短信(SMS)的解释分类以及原理
  18. 网络安全-IIS短文件名枚举漏洞
  19. 维基解密:CIA早就可以轻易入侵苹果手机和电脑
  20. C++黑客编程:键盘记录器,HOOK技术实现

热门文章

  1. 2022年博士招生 | 华南理工大学-鹏城实验室 联培博士 专项计划
  2. 正则表达式,匹配数字
  3. 经典机器学习算法:k近邻法
  4. 红外人体感应传感器SR602模块使用说明
  5. 如何能在面试的头5分钟内让HR喜欢你
  6. 解决HTML5页面在手机浏览器测试中发现 横向滚动条,尽管页面没有内容也是照常出现。
  7. 程序员的职业病,一定要注重身体健康才是最重要的
  8. DTI在早期脑发育研究中的应用
  9. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2022)-SGCL-DTI:用于DTI预测的监督图协同对比学习
  10. 【UE4】物理材质(蓝图)