フィールドのワイヤタイプが正しくありません。&は、kafkaとプロトコルバッファでメッセージを消費し、すべて正常に機能します。私はSerializeAsString()
(このアプリはC++で書かれた)でプロトコルバッファをシリアル化しています。Error:フィールドMessage.Field .protobuf.MessageTypeAck.sourceModuleID:1(期待値0)
ここで、新しいnode.js Webサイトを追加しました。これもメッセージを消費し、それらのデコードを試みます。
(偉大ProtoBuf.jsモジュールを使用して)私の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"
私は何をやっています違う? (デコード?)