Protocol buffers 如何在ProtoBuf(gRPC)-Proto3语法中添加消息类型作为对象?

Protocol buffers 如何在ProtoBuf(gRPC)-Proto3语法中添加消息类型作为对象?,protocol-buffers,grpc,proto3,protobuf.js,grpc-node,Protocol Buffers,Grpc,Proto3,Protobuf.js,Grpc Node,如何在ProtoBuf-Proto3语法中将消息类型作为对象发送 我想传输对象而不是字符串或数字 例子 在这里,我得到了一个错误 throw Error("no such Type or Enum '" + path + "' in " + this); ^ Error: no such Type or Enum 'object' in Type -- 变通办法 我可以在服务器端将其转换为字符串,然后在客户端将其转换为JSON.parse() 但我想知道,是否有更好的方法。根

如何在ProtoBuf-Proto3语法中将消息类型作为对象发送

我想传输对象而不是字符串或数字

例子 在这里,我得到了一个错误

throw Error("no such Type or Enum '" + path + "' in " + this);
        ^

Error: no such Type or Enum 'object' in Type
--

变通办法 我可以在服务器端将其转换为字符串,然后在客户端将其转换为JSON.parse()


但我想知道,是否有更好的方法。根据您要完成的任务,您可能会使用三种类型中的一种

  • bytes
    类型表示任意的字节字符串。您可以选择以您认为合适的方式对类型进行编码
  • any
    类型表示任意protobuf消息,允许客户端或服务器对非预定义消息进行编码。这是一个字节字符串,每个消息类型有一个唯一的标识符,语言实现将有方法解包消息
  • 你提到使用Javascript。对于基本类型,您可以使用
    oneof
    ,对于对象类型,您可以使用
    map
    的组合来定义Javascript对象消息
    如果要发送的所有键和值都具有相同的类型,则可以使用映射类型。您的示例显示了字符串键和字符串值,因此可以使用类型
    map

    如果要发送与JSON对象结构相似的任意对象数据,可以使用消息类型

    不支持对象数据类型

    但是,您可以使用协议缓冲区消息类型本身来分层模拟数据

    syntax = "proto3";
    
    package db;
    
    service Proxy
    {
        rpc myFunction(Request) returns (Response);
    }
    
    message Request
    {
        string name = 1;
    }
    
    message Response
    {
        message obj {
             string key1 = 1;
             string key2 = 2
        }
        obj keyvalue = 1;   // Here you have created your own type obj.
    }
    
    在上面的示例中,您可以看到响应消息现在具有类型为obj(您刚刚构建的自定义类型)的“keyvalue”字段

    现在,您将在来自服务器的回调中传递对象,而不是原语类型

    callback(null, { keyvalue: { key1: "value1", key2: "value2" } });
    

    假设您不知道键,但键/值对数据类型相同且您已知,那么在本例中,您可以使用
    map

    消息响应
    {
    map keyvalue=1;
    }
    回调(null,{keyvalue:{“key1”:“value1”,“key5”:“value2”});
    
    参考资料:-


    你能澄清一下你的目标是什么吗?你想表达什么样的对象?增加了更多的描述和例子,你能看一下吗?
    syntax = "proto3";
    
    package db;
    
    service Proxy
    {
        rpc myFunction(Request) returns (Response);
    }
    
    message Request
    {
        string name = 1;
    }
    
    message Response
    {
        message obj {
             string key1 = 1;
             string key2 = 2
        }
        obj keyvalue = 1;   // Here you have created your own type obj.
    }
    
    callback(null, { keyvalue: { key1: "value1", key2: "value2" } });
    
    message Response
    {
       map<string, string> keyvalue = 1;
    }
    callback(null, { keyvalue: { "key1": "value1", "key5": "value2" } });