gpt4 book ai didi

enums - GraphQL SDL 枚举类型

转载 作者:行者123 更新时间:2023-12-04 21:03:54 25 4
gpt4 key购买 nike

我们在 SDL 中定义了一堆枚举类型,它们非常适合查询和突变。
在解析器部分,这些被映射到代表后端那些枚举的字符串。

例如在 SDL 中我们有:

enum WRRole {
USER
PROVIDER
SUPPORT
ADMIN
SUPER_ADMIN
GUEST
}

在解析器部分,我们有:
WRRole: {
USER: 'user',
PROVIDER: 'provider',
SUPPORT: 'support',
ADMIN: 'admin',
SUPER_ADMIN: 'super admin',
GUEST: 'guest'
},

解析器使用 Mongoose 匹配 nodejs 后端中定义的枚举值,其中字段定义为:
...
roles: {
type: [
{
type: String,
enum: ['user', 'provider', 'support', 'admin', 'super admin', 'guest']
}
],
default: ['user']
},
...

我们对 GraphQL 枚举的问题是我们无法自省(introspection)枚举并使用 GraphQL 自省(introspection)取回映射......

这会导致构建 UI 时出现问题,我们希望在其中向用户呈现这些选项的下拉列表。 SDL 枚举值(例如 SUPER_USER)非常适合键,但我们希望显示实际的后端映射值以供选择使用。

这只是我们拥有的众多枚举中的一个示例。许多映射值由多个单词组成,这些单词之间有空格或包含 SDL 枚举值中不允许的字符的单词,例如本例中的“super admin”。

所以我的问题是......你们如何处理这样的事情而不必重复自己或在前端添加更多代码以将这些映射到更有用的有意义的名称以进行演示????

不能保证该顺序与后端枚举的定义顺序相匹配,因此添加到后端模型枚举会严重破坏 SUPER_USER 实际映射到“ super 用户”的任何假设,即使解析器知道这一点。

问候

史蒂夫

最佳答案

虽然这个恕我直言没有完美的解决方案
有几种方法可以解决这个问题

  • 优雅的方式
    您可以将接收 Enum 的查询添加到您的 graphql 架构中。姓名
    像这样(在 SDL 中):
    type Query {
    getEnumValues(enumName: String!): [EnumKeyValue!]!
    }

    type EnumKeyValue {
    key: String!
    value: String
    }

    这需要您稍微更改后端代码,例如我会更改 Enum解析器从这样的对象中获取数据:
    const enums = {
    WRRole: {
    USER: 'user',
    PROVIDER: 'provider',
    ...
    }
    };

    const enumResolver = {
    WRRole: {
    USER: enums.WRRole.USER,
    PROVIDER: enums.WRRole.PROVIDER,
    ...
    }
    };

    然后是 getEnumValues 的解析器看起来像:
    const queryResolvers = {
    getEnumValues(source, args) {
    const enumKey = args.enumName;

    // enums is the same enums object from the previous example
    return Object.keys(enums[enumKey]).map(key => ({
    key,
    value: enums[enumKey][key]
    }))

    }
    };

  • 肮脏,辱骂但很快
    另一种可能有点滥用的方法是在 Enum 上添加描述。值(value)
    所以你的Enum SDL想:
        enum WRRole {
    # user
    USER
    # provider
    PROVIDER
    # support
    SUPPORT
    # admin
    ADMIN
    # super admin
    SUPER_ADMIN
    # guest
    GUEST
    }

    然后您可以使用以下查询获取键和描述之间的映射:
        {
    __type(name: "WRRole") {
    enumValues {
    description
    name
    }
    }
    }
  • 关于enums - GraphQL SDL 枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51604231/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com