protobufjs decode 报错?

image.png

import protobuf from 'protobufjs';

const messageType: AnyObject = {
  1: '认证消息👋',
  2: '心跳消息💗',
  40000: '自定义消息🪡'
};

class ProtobufMessage {
  RequestUser: any;
  constructor() {
    this.RequestUser = null;
  }

  async initCreateUser() {
    return new Promise(resolve => {
      if (this.RequestUser !== null) {
        return resolve(this.RequestUser);
      }
      // 此处访问的是public/protobufjs/NetMessage.proto;
      protobuf.load('/protobufjs/NetMessage.proto', (err: any, root: any) => {
        if (err) {
          return resolve(null);
        }

        const RequestUser = root.lookupType('com.network.message.web.NetMessage'); // Obtain a message type
        this.RequestUser = RequestUser;
        resolve(RequestUser);
      });
    });
  }
  // 编码
  async requestUserEncoder(data: MsgType.INetMessage) {
    console.log(`📱向服务端发送【${messageType[data.messageid as string]}】消息`, data);
    const RequestUser: any = await this.initCreateUser();
    if (RequestUser !== null) {
      const payload = data;
      const errMsg = RequestUser.verify(payload);
      if (errMsg) {
        console.log(errMsg);
        return null;
      }
      const message = RequestUser.create(payload); // or use .fromObject if conversion is necessary
      const buffer = RequestUser.encode(message).finish();
      const dview1 = new DataView(new Uint8Array(buffer).buffer);
      const len = dview1.byteLength;
      const buff = new ArrayBuffer(4 + len);
      const dview = new DataView(buff);
      dview.setInt32(0, len);
      for (let i = 0; i < len; i++) {
        dview.setUint8(4 + i, dview1.getUint8(i));
      }
      return dview.buffer;
    }
  }
  // 解码
  async responseUserDecoder(data: any): Promise<MsgType.INetMessageResponse> {
    // eslint-disable-next-line no-async-promise-executor
    return new Promise(async resolve => {
      const RequestUser: any = await this.initCreateUser();
      const reader = new FileReader();
      reader.readAsArrayBuffer(data);
      reader.onload = function () {
        const buf = new Uint8Array(reader.result as Uint8Array);
        console.log(buf);
        console.log(RequestUser);
        const response = RequestUser.decode(buf).toJSON();
        console.log(`💻接收到服务端【${messageType[response.messageid]}】消息`, response);
        resolve(response);
      };
    });
  }
}
export default new ProtobufMessage();
阅读 1.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进