微信小程序RequestTask.onChunkReceived返回的数据流如何解析?微信小程序不支持TextDecoder怎么办?

最近踩坑不少,关于微信小程序如何解决数据流的问题,总结一下

1、下载js文件

miniprogram/miniprogram-text-decoder.js at main · 123456789xzxz/miniprogram · GitHub

miniprogram/miniprogram-text-encoder.js at main · 123456789xzxz/miniprogram · GitHub

然后按需要引入就行

import TextDecoder from './miniprogram-text-decoder'

import TextEncoder from './miniprogram-text-encoder'

文件下载来后,引入小程序:

import TextDecoder from '@/utils/miniprogram-text-decoder'

使用方式:

javascript 复制代码
let tempUint8Array = new Uint8Array(0)
const requestTask = wx.request({
    url: baseURL,
    timeout: 15000,
    method: 'post',
    enableChunked: true, // 开启分片模式
    header: { },
    data: param
})
requestTask.onChunkReceived((response) => {
    const arrayBuffer = new Uint8Array(response.data)
    let str = new TextDecoder().decode(arrayBuffer)
    console.log('deMessage', str)
}

2、Protobuf 处理

1、下载依赖

需要注意下Protobuf版本 使用 protobufjs@6.8.6最好,我在使用的时候安装7.多 莫名奇妙

css 复制代码
npm install -g protobufjs@6.8.6

2、执行pbjs

3、转换proto文件

将文件流回来的数据格式在网站JSON转Protobuf,在线JSON转Protobuf - 图灵工具 在线工具系统

上转化为标准的proto文件,新建文件awesome.proto,将转化好的文件复制进去,保存;

执行命令

复制代码
pbjs -t json awesome.proto > awesome.json

运行之后会生成一个 awesome.json文件

json 复制代码
"nested": {
        "AwesomeMessage": {
            "fields": {
                "awesomeField": {
                    "type": "string",
                    "id": 1
                }
            }
        }
    }
复制代码
4、转js文件

此时的json文件我们不能直接使用,不过我们可以将json对象取出放到小程序项目当中去,比如在小程序项目中新建一个awesome.js

java 复制代码
module.exports = {
    "nested": {
        "AwesomeMessage": {
            "fields": {
                "awesomeField": {
                    "type": "string",
                    "id": 1
                }
            }
        }
    }
};
5、最后使用
javascript 复制代码
// 引入
var protobuf = require('../../weichatPb/protobuf') //引入protobuf模块
var awesomeConfig = require('@/utils/protobuf/protobuf.js') //加载awesome.proto对应的json
//awesome
var AwesomeRoot = protobuf.Root.fromJSON(awesomeConfig)
var AwesomeMessage = AwesomeRoot.lookupType('AwesomeMessage')
//awesome


test1() {
      var payload = {awesomeField: "我是test1"};
      var message = AwesomeMessage.create(payload)
      var buffer = AwesomeMessage.encode(message).finish()
      console.log('buffer', buffer)
      var deMessage = AwesomeMessage.decode(buffer)
      console.log('deMessage', deMessage)
    }
相关推荐
不爱吃糖的程序媛5 分钟前
Electron 应用中的系统检测方案对比
前端·javascript·electron
泷羽Sec-静安9 分钟前
Less-9 GET-Blind-Time based-Single Quotes
服务器·前端·数据库·sql·web安全·less
pe7er21 分钟前
用高阶函数实现递归:从匿名函数到通用递归生成器
前端·javascript
IT古董38 分钟前
全面理解 Corepack:Node.js 的包管理新时代
前端·node.js·corepack
学习3人组42 分钟前
清晰地说明 NVM、NPM 和 NRM 在 Node.js 开发过程中的作用
前端·npm·node.js
矢心1 小时前
setTimeout 和 setInterval:看似简单,但你不知道的使用误区
前端·javascript·面试
一枚前端小能手1 小时前
🧭 使用历史记录 API - SPA导航与状态管理的完整指南
前端·javascript
用户47949283569151 小时前
从字符串满天飞到优雅枚举:JavaScript 常量管理的几种姿势
前端·javascript
qq_415216251 小时前
Vue3+vant4+Webpack+yarn项目创建+vant4使用注意明细
前端·webpack·node.js
李建军1 小时前
ASP.NET Core Web 应用SQLite数据连接显示(1)
前端