gRPC Any type - Uncaught TypeError: deserialize is not a function

gRPC Any type - Uncaught TypeError: deserialize is not a function

我在 gRPC 中遇到了一个让我发疯的问题。我有一个 .NET gRPC 服务,我的 ReactJS 客户端正在连接到它 - 这工作正常。我正在订阅我的流,并按预期通过流获取数据。我在反序列化消息中存在的“google.protobuf.Any”类型时遇到问题。我收到的是这样的:

message PointNotification {
    KindsOfPointNotification Kind = 1;
    google.protobuf.Any NotificationData = 2;
}

在 ReactJS 客户端内部,我正在执行以下操作:

useEffect(() => {
    console.log("Subscribing to point stream");
    var pointStream = client.subscribeToNotificationStream(new Empty(), {});
    pointStream.on("data", (response) => {
        switch (response.getKind())
        {
            case KindsOfPointNotification.KINDS_OF_POINT_NOTIFICATION_POINT_ADDED_OR_UPDATED:
                const any = response.getNotificationdata();
                console.log(any);
                const bar = any.unpack(NotificationPointAddedOrUpdated.deserializeBinary, any.getTypeName());
                console.log(bar);
                break;
            case KindsOfPointNotification.KINDS_OF_POINT_NOTIFICATION_POINT_REMOVED:
                console.log("Point removed");
                break;
        }
    });

“任何”变量在浏览器日志中看起来是正确的。有效负载和 typeName 是正确的。但是,当我去解压缩“任何”时,我收到以下错误(屏幕截图):

TypeError in browser

Uncaught TypeError: deserialize is not a function

尽管生成的 _pb 文件具有以下方法:

/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.Point.NotificationPointAddedOrUpdated}
*/
proto.Point.NotificationPointAddedOrUpdated.deserializeBinary = function(bytes) {
   var reader = new jspb.BinaryReader(bytes);
   var msg = new proto.Point.NotificationPointAddedOrUpdated;
   return proto.Point.NotificationPointAddedOrUpdated.deserializeBinaryFromReader(msg, 
   reader);
};

根据The documentation,这是正确的做法。我错过了什么?为什么我会收到反序列化错误?

编辑:我还有一件事要补充。如果我更改以下行:

const bar = any.unpack(NotificationPointAddedOrUpdated.deserializeBinary, any.getTypeName());

收件人:

const bar = any.unpack(NotificationPointAddedOrUpdated.deserializeBinary(), any.getTypeName());

我在浏览器中得到的错误更改为:

Uncaught TypeError: _proto_pointdata_pb_js__WEBPACK_IMPORTED_MODULE_3___default(...).deserializeBinary is not a function

以下问题使我找到了解决方案:https://github.com/protocolbuffers/protobuf/issues/5482

之前的开发人员没有使用 base64 编码数据,这导致了 JavaScript 中的反序列化问题。