用户发送信息到微信服务器,然后微信服务器向我们的服务器发送信息,这个信息属于一个流式的数据,我们要写一些方法处理这个数据
- 我们新建
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.xml
if (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);
}
}
}
当我们发送消息的时候经过格式化,他是这样的