2016-05-01 5 views
1

フィールドのワイヤタイプが正しくありません。&は、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" 

私は何をやっています違う? (デコード?)

答えて

1

ありがとう、このSO question&answerのおかげで、私はそれを理解した! 問題は私がバッファを消費する方法(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」hereを述べた通りである)の行を「バッファ」。

関連する問題