You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:42:49