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 中的反序列化问题。
我在 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 中的反序列化问题。