zl程序教程

您现在的位置是:首页 >  工具

当前栏目

微信公众号开发之流式数据读取

微信数据开发 读取 公众 流式
2023-09-11 14:19:18 时间

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

  • 我们新建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);
        }
    }
}

当我们发送消息的时候经过格式化,他是这样的
在这里插入图片描述