使用protobufjs编码消息返回空Buffer问题排查求助
问题原因分析与解决方案
你的问题核心出在**IcaoContainer的entries字段类型不匹配**上:
看你的proto定义,entries是repeated Icao类型——也就是它本质是一个Icao对象的数组,但你在代码里直接把单个Icao对象赋值给了container.entries:
container.entries = data
protobufjs对repeated字段的校验很严格,只会识别数组格式的值。如果你传单个对象,它会判定这个字段没有被正确初始化,编码时直接忽略该字段,最终导致编码后的Buffer为空。
修改后的代码
只需要把container.entries改成数组形式即可:
setValue(value) { var address = makeAddress(value); let data = protobuf["Icao"].create({data:value}) let container = protobuf["IcaoContainer"].create() // 关键修改:将单个对象放入数组中,匹配repeated字段类型 container.entries = [data] console.log(container) var stateEntriesSend = {} stateEntriesSend[address] = protobuf['IcaoContainer'].encode(container).finish(); console.log(stateEntriesSend[address]) return this.context.setState(stateEntriesSend, this.timeout).then(function(result) { console.log("Success", result) }).catch(function(error) { console.error("Error", error) }) }
验证效果
修改后,console.log(container)的输出会变成:
IcaoContainer { entries: [ Icao { data: <Buffer a2 66 61 63 74 69 6f 6e 63 73 65 74 64 64 61 74 61 68 61 73 61 70 6f 69 75 79> } ] }
此时再调用encode方法,就能得到包含有效数据的Buffer了。
内容的提问来源于stack exchange,提问作者pavithra prabodha
相关产品推荐
相关产品推荐

