错误:字段Message.Field .protobuf.MessageTypeAck.sourceModuleID的非法导线types:1(0预期)

我有应用程序与卡夫卡和协议缓冲profde&消费信息,一切都很好。 我使用SerializeAsString()序列化协议缓冲区(这个应用程序是用c ++编写的)。

现在,我添加了一个新的node.js网站,它也使用消息并尝试解码它们。

我的JS代码(使用伟大的ProtoBuf.js模块):

 var builder = ProtoBuf.loadProtoFile("/home/aii/general/proto/All.proto"), protobuf = builder.build("protobuf"), Trace = protobuf.Trace, MessageType = protobuf.MessageType, MessageTypeAck = protobuf.MessageTypeAck, MessageTypeKeepAlive = protobuf.MessageTypeKeepAlive; function getMessageType(val) { return Object.keys(MessageType).filter(function(key) {return MessageType[key] === val})[0] } consumer.on('message', function (message) { try{ switch(getMessageType(message.key[0])) { case 'MESSAGE_TYPE_ACK': console.log(MessageTypeAck.decode(message.value)); break; case 'MESSAGE_TYPE_KEEP_ALIVE': console.log(MessageTypeKeepAlive.decode(message.value)); break; default: console.log("Unknown message type"); } } catch (e){ if (e.decoded) { var err = e.decoded; console.log(err); } else { console.log(e); } } }); 

结果:

 [Error: Illegal wire type for field Message.Field .protobuf.MessageTypeAck.sourceModuleID: 1 (0 expected)] 

我的原始文件:

Trace.proto:

 package protobuf; message Trace { optional string topic = 1; optional int32 partition = 2; optional int64 offset = 3; } 

MessageType.proto

 package protobuf; enum MessageType { MESSAGE_TYPE_ACK = 1; MESSAGE_TYPE_KEEP_ALIVE = 2; } 

Messages.proto:

 import "Trace.proto"; package protobuf; message MessageTypeAck { repeated Trace trace = 1; optional string sourceModuleName = 2; optional int32 sourceModuleID = 3; } message MessageTypeKeepAlive { repeated Trace trace = 1; optional string sourceModuleName = 2; optional int32 sourceModuleID = 3; } 

All.proto

 import "Trace.proto" import "MessageType.proto"; import "Messages.proto" 

我究竟做错了什么? (解码?)

所以,感谢这个问题和答案 ,我明白了! 这个问题与我使用缓冲区的方式(通过kafka)有关 – 如utf-8(默认)。 它实际上涉及到我没有附加的代码:

 var kafka = require('kafka-node'), Consumer = kafka.Consumer, client = new kafka.Client('localhost:2181'), consumer = new Consumer( client, [ { topic: 'Genesis', partition: 0 } ], { autoCommit: false, encoding: 'buffer' } ); 

解决方法是添加编码:“缓冲区”行(默认为'utf-8',如上所述)。