Protobuf encode возвращает нулевые значения - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь закодировать сообщение в буфер, используя метод кодирования в protobuf js.

, это мой код.

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;
}

что здесь не так.

1 Ответ

0 голосов
/ 10 апреля 2020

На всякий случай, если у кого-то еще возникла такая же проблема, я выяснил, где это пошло не так.

согласно моему сообщению Icao, я определил в своем прото-коде, что данные должны быть строкой. Но когда я вызываю метод setValue, я передаю объект JSON вместо этого строкового значения. поэтому, когда я использую

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

, значение не является строкой. это была проблема. согласно protobuf js документации , всегда полезно проверять полезную нагрузку перед использованием метода create it. вот так.

 // 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

Это вызвало у меня ошибку, сказав, что данные должны быть String. это была проблема.

А также, поскольку я использовал ключевое слово repeated в моем IcaoContainer container.entries должен быть массивом.

...