当前位置: 首页 > 知识库问答 >
问题:

如何使用节点grpc将枚举解析为字符串值?

尉迟安民
2023-03-14

将grpc与Node一起使用,对我的查询的响应中的枚举将解析为整数值。但是,当我使用BloomRPC进行相同的查询时,枚举将解析为整数值。

是否有参数或选项可以强制使用Node grpc将这些枚举解析为字符串?

共有2个答案

萧嘉禧
2023-03-14

如果您使用的是@grpc/proto-loader库,您可以将选项enum设置为值String(不是字符串“String”,构造函数String)。然后所有枚举值都将由它们的名称字符串表示。

申屠健
2023-03-14

在我们的项目中,我们使用枚举通过消除人为错误来帮助我们确保有限可能性集的完整性。当我们有协议缓冲区枚举如此方便时,为什么我们需要记住字符串值是什么?因此,我们使用. proto作为真理的来源;这是我们的规则。

要做到这一点,请遵循以下步骤,这些步骤是为ES6代码编写的。

  1. 中定义gRPC/Protobuf枚举。proto文件
// life.proto
syntax = 'proto3';
package life;

enum Choices
{
  EAT = 0;
  DRINK = 1;
  SLEEP = 2;
  CODE = 3;
  SKI = 4;
}
$ npm i -s @grpc/proto-loader @grpc/grpc-js
// myNodeApp.js
import * as grpc from '@grpc/grpc-js'
import * as protoLoader from '@grpc/proto-loader'
import path from 'path'

// these options help make definitions usable in our code
const protoOptions = {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true
}

// this allows us to prepare the path to the current dir
const dir = path.dirname(new URL(import.meta.url).pathname)
// this loads the .proto file
const lifeDef = protoLoader.loadSync(path.join(dir, 'life.proto'), protoOptions)
// this loads the package 'life' from the .proto file
const life = grpc.loadPackageDefinition(lifeDef).life
// myNodeApp.js (cont'd)
console.log(life.Choices)

/* stdout */
{
  format: 'Protocol Buffer 3 EnumDescriptorProto',
  type: {
    value: [ [Object], [Object], [Object], [Object], [Object] ],
    name: 'Choices',
    options: null
  },
  fileDescriptorProtos: [
    <Buffer 0a ... 328 more bytes>
  ]
}

...更深入地看。。。

console.log(life.Choices.value)

/* stdout */
{
  value: [
    { name: 'EAT', number: 0, options: null },
    { name: 'DRINK', number: 1, options: null },
    { name: 'SLEEP', number: 2, options: null },
    { name: 'CODE', number: 3, options: null },
    { name: 'SKI', number: 4, options: null }
  ],
  name: 'Choices',
  options: null
}

// myNodeApp.js
const myDay = { // plain JSON (or define a gRPC message, same same)
  dawn: life.Choices.type.value[1].name,
  morning: life.Choices.type.value[0].name,
  afternoon: life.Choices.type.value[4].name,
  evening: life.Choices.type.value[3].name,
  night: life.Choices.type.value[2].name
}

您可以编写访问器或实用程序函数来管理密钥查找(通过传递导入的grpc枚举和索引),如下所示:

export const getEnumByName = function (protoEnum, needle) {
  return protoEnum.type.value.find(p => {
    return p.name === needle
  })
}

export const getEnumByNum = function (protoEnum, needle) {
  return protoEnum.type.value.filter(p => {
    return p.number = needle
  })
}

export const getEnumKeys = function (protoEnum, key = 'name') {
  return protoEnum.type.value.map(p => {
    return p[key]
  })
}

其他答案中已经介绍了反转消息并为其赋值,只需使用表示枚举名称的字符串将枚举字段设置为字符串值,您可以猜到,该字符串表示使用上述代码访问的枚举名称。

这就是我们的做法。干净简单,只是有一点模糊,直到有一天你看到“引擎盖下”。

了解有关@grpc/proto loader和@grpc/grpc js的更多信息。希望这对野外的人有所帮助。:)

 类似资料:
  • 考虑一下,我得到了以下枚举类: 我想指定ostream操作符( 并获得以下输出,这是Foo。 我的问题是: 是否有存储枚举“名称说明符”的地方?(即,对于枚举类TestEnum,它是None、Foo和Bar),因此我可以编写一个函数(或者至多是函数模板)来指定TestEnum的ostream操作符,例如: 到目前为止,我是这样做的: 我见过一些使用库的解决方案,但这次我不希望使用它。

  • 问题内容: 当用户登录时,我正在设置一个sessionScope对象,并且那个bean对象由几个其他bean组成。这些bean的属性之一是枚举,但是我发现EL无法获取enum类的属性,而只能获取Java bean对象的属性。因此,我决定为该枚举创建一个bean类,并将该枚举嵌套在该bean类中。我为替换枚举而制作的java bean,以便可以通过EL获得其值,如下所示: 但是,当我尝试访问等级名称

  • 例如,我如何做类似的事情: 结果示例:

  • 本文向大家介绍Java将枚举转换为字符串,包括了Java将枚举转换为字符串的使用技巧和注意事项,需要的朋友参考一下 示例 有时您想将枚举转换为String,有两种方法可以实现。 假设我们有: 那么,我们如何将类似的东西转换Fruit.APPLE为"APPLE"? 使用转换 name() name()是一个内部方法,enum该方法返回String枚举的表示形式,返回值精确String表示枚举值的定义

  • 我在TypeScript中定义了以下枚举: 现在在我的函数中,我接收颜色作为字符串。我已经尝试了以下代码: 如何将该值转换为枚举?

  • 我的JSON如下所示: 我的课程如下所示: 如何反序列化到映射如和到