2016-03-28 20 views
0

私は、confluent.io kafkaパッケージを使用してavroメッセージを含むカフカストリームを持っています。これはJavaアプリケーションにとってうまくいきます。しかし、私は今、これらのメッセージをjavascriptで読み込もうとしています。範囲外のインデックスthis.buf.utf8Slice

私はkafka-node + avscパッケージを使用して、スキーマを使用してバッファ配列から文字列にメッセージをデコードしようとしました。コンフルエントは、最初の5バイトをスキーマIDのマジックバイト(0)+ 4バイトとして置きます。

私はこれらのバイトを削除するためにスライスをスライスし、これをデコードするためにavscに送信しようとします。しかし、私はエラー

return this.buf.utf8Slice(pos, pos + len);

RangeError: out of range index at RangeError (native) at Tap.readString (C:\git\workflowapps\workItemsApp\node_modules\avsc\lib\utils.js:452:19) at StringType._read (C:\git\workflowapps\workItemsApp\node_modules\avsc\lib\types.js:612:58)

はまた、手動で、これは非UTF8文字の多くを残して、私はそのようにデータを失っていデコードしようとします。

サンプルコード:

consumer.on('message', function(message) { 
     var val = message.value.slice(4); 
     sails.log.info('val buffer', val, val.length); 
     sails.log.info('hex',val.toString('hex')); 
     var type = avro.parse({"type":"record", 
     "name":"StatusEvent", 
     "fields":[{"name":"ApplicationUUID","type":"string"}, 
     {"name":"StatusUUID","type":"string"}, 
     {"name":"Name","type":"string"}, 
     {"name":"ChangedBy","type":"string"}, 
     {"name":"ChangedByUUID","type":"string"}, 
     {"name":"ChangedAt","type":"long"}] 
     }); 

     var decodedValue = type.fromBuffer(val); 
     sails.log.info('Decoded', decodedValue); 
    }); 

答えて

1

あなたslice(5)(そうでない場合はあなたが唯一の5ヘッダバイトのうち4つをスキップしている)slice(4)でなければなりません。役に立つ情報hereもあります。

+0

スライスがゼロで開始したと思った。今は正確な損失エラーです。私はこれがスキーマでは長いと思います。それを文字列に変更すると、エラーは切り詰められたバッファに変わります。私はこのデータにヌルがないことを知っています。 – KnowHowSolutions

+0

ロングとストリングの切り替えは機能しません。精度ロスエラーを修正するには、 "ビッグ整数"ライブラリを使用する必要があります。ここに手順があります:https://github.com/mtth/avsc/wiki/Advanced-usage#custom-long-types – mtth

+0

これは基本的にこれは私がすでに知っていて、まだ解決していない別の問題を示しています。私はC#のダニがavroに来ている、私は本当にしたくない。最初に修正してください。お手伝いありがとう。 – KnowHowSolutions

関連する問題