【问题标题】:Protobuf encode returns null valuesProtobuf 编码返回空值
【发布时间】:2020-04-09 11:55:18
【问题描述】:

我正在尝试使用 protobufjs 中的 encode 方法将消息编码到 Buffer 中。

这是我的代码。

setValue(value) {
        var address = makeAddress(value);
        let data = protobuf["Icao"].create({data:value})
        let container = protobuf["IcaoContainer"].create()
        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> } }

但我正在尝试使用 protobuf['IcaoContainer'].encode(container).finish() 将其编码为缓冲区

它似乎返回了一个空缓冲区。 console.log(stateEntriesSend[address]) 的值低于

<Buffer >

我的原型文件。

syntax = "proto3";

message Icao {
  string data = 1;
}

message IcaoContainer {
  repeated Icao entries = 1;
}

这里有什么问题?

【问题讨论】:

    标签: javascript node.js protocol-buffers proto protobuf.js


    【解决方案1】:

    以防万一其他人遇到同样的问题,我已经弄清楚哪里出了问题。

    根据我的 Icao 消息,我在我的原型中定义了数据应该是一个字符串。但是当我调用 setValue 方法时,我传递的是一个 JSON 对象而不是那个字符串值。所以当我使用

    protobuf["Icao"].create({data:value})
    

    该值不是字符串。这就是问题所在。根据protobufjs documentation,在使用 create 方法之前验证有效负载始终是一个好习惯。像这样。

     // Exemplary payload
        var payload = { awesomeField: "AwesomeString" };
    
        // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
        var errMsg = AwesomeMessage.verify(payload);
        if (errMsg)
            throw Error(errMsg);
    
        // Create a new message
        var message = AwesomeMessage.create(payload); // or use .fromObject if conversion is necessary
    
        // Encode a message to an Uint8Array (browser) or Buffer (node)
        var buffer = AwesomeMessage.encode(message).finish();
        // ... do something with buffer
    

    这给我一个错误,说数据必须是字符串。这就是问题所在。

    而且由于我在 IcaoContainer 中使用了 repeated 关键字,container.entries 应该是一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2022-01-14
      • 2023-03-06
      • 2018-08-24
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多