node.js - 序列化失败(grpc/node)
问题描述
对于 node/grpc 示例,我正在尝试遵循此处找到的静态代码生成示例。我使用的是我自己的原型文件,但其余代码看起来应该很熟悉。
'use strict'
var messages = require('./time_series_pb.js');
var services = require('./time_series_grpc_pb.js');
var grpc = require('grpc');
var async = require('async');
var client = new services.TimeSeriesServiceClient(
"localhost:50051",
grpc.credentials.createInsecure()
);
function getTimeSeries(callback) {
var call = client.getTimeSeries();
call.on('data', function(data) {
console.log(data);
});
call.on('end', callback);
call.on('error', function(error) {
console.log(error);
});
var request = new messages.GetTimeSeriesRequest();
request.setName("foo");
call.write(request);
call.end();
}
function main() {
async.series([
getTimeSeries
]);
}
main();
我也有一些服务器代码。
'use strict'
var messages = require('./time_series_pb.js');
var services = require('./time_series_grpc_pb.js');
var grpc = require('grpc');
function getTimeSeries(call) {
call.on('data', function(request) {
var response = new messages.GetTimeSeriesResponse();
response.setName("bar");
call.write(response);
});
call.on('error', function(error) {
console.log(error);
});
call.on('status', function(status) {
console.log(status);
});
call.on('end', function() {
call.end();
});
}
function getServer() {
var server = new grpc.Server();
server.addService(services.TimeSeriesServiceService, {
getTimeSeries: getTimeSeries
});
return server;
}
function main() {
var server = getServer();
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
console.log("Starting server");
server.start();
}
main();
我可以毫无问题地运行服务器代码,但是当我尝试与客户端连接时,我看到以下堆栈跟踪。
{ Error: 13 INTERNAL: Serialization failure
at Object.exports.createStatusError (/home/nbkiq0w/getapi-platform/getapi-examples/node/node_modules/grpc/src/common.js:87:15)
at ClientDuplexStream._emitStatusIfDone (/home/nbkiq0w/getapi-platform/getapi-examples/node/node_modules/grpc/src/client.js:235:26)
at ClientDuplexStream._readsDone (/home/nbkiq0w/getapi-platform/getapi-examples/node/node_modules/grpc/src/client.js:201:8)
at /home/nbkiq0w/getapi-platform/getapi-examples/node/node_modules/grpc/src/client_interceptors.js:679:15
code: 13,
metadata: Metadata { _internal_repr: {} },
details: 'Serialization failure' }
我真的无法在谷歌上搜索到如此具体的情况,我能找到的结果让我相信这并不好。据此,错误代码为 13
Means some invariants expected by underlying system has been broken. If you see one of these errors, something is very broken.
我意识到这不是很多事情,所以有人对如何调试有任何建议吗?如何获得更详细的错误输出?
节点版本 6.12.0
编辑1:
当我删除“call.write(request)”行时,客户端运行没有问题,所以它似乎源于那行代码。
解决方案
该错误消息表明消息序列化(将传递给 gRPC 的消息对象转换为二进制数据)失败。这通常是因为消息对象与预期的消息类型不匹配或无效。此失败的错误信息目前在客户端或服务器上是相同的,因此它不直接指示应归咎于哪个。
在那个特定的代码示例中,只有两行代码可以触发错误: call.write(request);
客户端代码和call.write(response);
服务器代码。所以这里最可能的问题是这些对象之一有问题,或者这些对象之一的类型与方法签名所指示的类型不同。
服务器发送的消息是由客户端发送的消息触发的,因此缩小问题所在的一种方法是删除call.write(response)
服务器代码中的行。如果仍然出现错误,则问题出在客户端,如果没有,则问题出在服务器上。
推荐阅读
- powershell - Powershell脚本 - 替换文件中的文本
- android-11 - 为什么隐藏状态栏也会隐藏某些 Android 11 设备上的导航栏?
- r - 如何使用另一个索引中的索引来定位变量的变化 - R
- flutter - 颤动中的 DraggableScrollable 工作表动画
- reactjs - React Js:在页面手动刷新之前无法登录
- angular - 具有角度的剑道网格与剑道多选
- sendgrid - SendGrid - 如何从 Opt-Out Preferences 页面隐藏“View Opt Out Preferences”按钮
- testing - 在编写赛普拉斯自定义命令时替代条件语句?测试测试
- html - 将超链接自定义为按钮 Shiny R
- eclipse-rcp - 将 RCP 项目更新到 Eclipse Tycho >= 2.0 会导致来自不同存储库的功能“无法满足依赖关系”