【问题标题】:Retrieve nested list (matrix) from gRPC in NodeJS从 NodeJS 中的 gRPC 检索嵌套列表(矩阵)
【发布时间】:2020-12-29 14:12:51
【问题描述】:

我将gRPCNodeJs 一起使用,我想要的响应是这样的(JS 格式的示例):

[
  ['aa1', 0, 0],
  ['aa2', 0, 0],
  ...
  ['aaN', 0, 0],
]

是另一个列表中的列表。类似于二维数组或矩阵。

这里的问题是我没有看到在没有键/值字段的对象中返回列表的示例,所以我不知道如何创建.proto 文件。

现在我有这样的东西:

message Response{
  repeated ResponseData data = 1;
}
message ResponseData {
  repeated string field1 = 1;
  repeated uint32 field2 = 2;
  repeated uint32 field3 = 3;
}

并进入节点文件以获取和读取数据我有类似的东西:

client.getData(request, {}, (err, response)=> {
  var result = response.getDataList();
  // ^^^^^^^ here I want to get the matrix
}

我也试过:

var result = response.getDataList();
result.forEach(element => {
  console.log("element 1 = ",element.getField1List())
  console.log("element 2 = ",element.getField2List())
  console.log("element 3 = ",element.getField3List())
})

但是从element.getFieldXList() 返回的数组是空的。

我也从服务器发送这个测试矩阵:

[["0",0,0],["1",1,1],["2",2,2],["3",3,3]]

感谢任何帮助。
提前致谢。

编辑:
使用console.log(JSON.stringify(result)) 输出为:

[{"wrappers_":null,"arrayIndexOffset_":-1,"array":[[],[],[]],"pivot_":1.7976931348623157e+308,"convertedPrimitiveFields_":{}},{"wrappers_":null,"arrayIndexOffset_":-1,"array":[[],[],[]],"pivot_":1.7976931348623157e+308,"convertedPrimitiveFields_":{}},{"wrappers_":null,"arrayIndexOffset_":-1,"array":[[],[],[]],"pivot_":1.7976931348623157e+308,"convertedPrimitiveFields_":{}},{"wrappers_":null,"arrayIndexOffset_":-1,"array":[[],[],[]],"pivot_":1.7976931348623157e+308,"convertedPrimitiveFields_":{}}]

【问题讨论】:

  • 你能在getData回调中console.log(JSON.stringify(result))向我们展示输出吗?
  • 是的!使用console.log() 结果更新问题。
  • 哦,好吧,这绝对是 grpc 服务器端的问题,因为每个 array 中的元素都是空的。我以为您在 nodejs 代码中映射它时遇到问题。由于我没有使用 grpc 的经验,我无法在这里提供帮助,抱歉 :)
  • 哦,好的,无论如何感谢您的建议。我将查看服务器,但现在它发送此对象:[["0",0,0],["1",1,1],["2",2,2],["3",3,3]] 所以应该没问题,所以问题可能出在proto 结构并尝试映射此列表...

标签: javascript node.js grpc protoc grpc-node


【解决方案1】:

问题中的protobuf消息定义描述了一个包含对象列表的对象,每个对象都有三个字段,每个字段都有一个原始值列表。但是,您说您尝试发送列表列表,这是一种非常不同的结构。要发送消息,您需要提供具有相同结构的对象。对于提供的消息类型,看起来像这样:

response = {
  data = [
    {
      field1: ["0"],
      field2: [0],
      field3: [0]
    },
    {
      field1: ["1"],
      field2: [1],
      field3: [1]
    },
    // ...
  ]
}

如果您想表示与问题中的列表更相似的内容,您可能希望ResponseData 消息的内部字段不是repeated

【讨论】:

  • 非常感谢您的回答,我去看看。但我想要一份清单。这是对象列表的解决方案吗?我正在寻找一个矩阵解决方案,作为第一个示例。
  • 你不能在 Protobuf 中直接表示列表的列表。您需要将其翻译成问题中的某种消息格式。
  • 我不知道。然后我明天会检查你的解决方案。非常感谢!
猜你喜欢
  • 2022-01-23
  • 2018-07-12
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2021-11-17
  • 2023-03-16
相关资源
最近更新 更多