Node.js 序列化失败(grpc/节点)

Node.js 序列化失败(grpc/节点),node.js,serialization,protocol-buffers,rpc,grpc,Node.js,Serialization,Protocol Buffers,Rpc,Grpc,我正试图按照找到的静态codegen示例,使用node/grpc示例。我正在使用我自己的原型文件,但是其余的代码看起来应该很熟悉 'use strict'

我正试图按照找到的静态codegen示例,使用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)
行。如果仍然出现错误,则问题出在客户端,否则问题出在服务器上。

该错误可能来自客户端或服务器。您的服务器只在收到消息后才发送消息,因此删除客户端上的
调用。write
可以消除这两种情况。无论哪种情况,该错误都意味着protobuf序列化出现了问题。如果看不到
.proto
文件,就很难准确地判断到底出了什么问题。