序列化失败(grpc/节点)



我正在尝试遵循此处找到的静态代码生成示例,用于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)行。如果仍然收到错误,则问题出在客户端上,如果不是,则问题出在服务器上。

最新更新