2

https://launchpad.graphql.com/9qvqz3v5r

这是我的示例 graphQL Schema。我正在尝试使用枚举类型。我如何从后端获取枚举值并将其提供给架构?

// Construct a schema, using GraphQL schema language
const typeDefs = `
  type User {
        userId: Int
        firstName: String
        lastName: String
        pincode:String
        state:String
        country:String
  }
  type Query {
    hello: String
    user: User
  }
  type CreateUserLoad {
    user: User 
  }
  enum Role {
        writer
        reader
        author
        admin
        superAdmin
  }
  type Mutation{
        createUser(firstName: String, lastName: String, role: Role): User
  }
`;

我想将动态变量中的枚举角色值填充为

const roleData = ['writer','reader','author','admin','superAdmin'];

谁能帮我?

4

3 回答 3

2

您可以简单地使用字符串插值:

// Construct a schema, using GraphQL schema language
const typeDefs = `
  type User {
        userId: Int
        firstName: String
        lastName: String
        pincode:String
        state:String
        country:String
  }
  type Query {
    hello: String
    user: User
  }
  type CreateUserLoad {
    user: User 
  }
  enum Role { ${roles.join(' ')} }
  type Mutation{
        createUser(firstName: String, lastName: String, role: Role): User
  }
`;

事实上,在每个传入的 grahpql 查询中,您都必须将解析后的模式传递给 graphql 服务器,因此您甚至可以为每个请求更改它。在这种情况下,最好更改模式解析返回的对象表示。

对于直接创建枚举类型,假设您有一个值数组userRoles并想要一个RolesEnum类型,那么您可以像这样创建它:

const roleValues = {}
for (const value of userRoles) {
    roleValues[value] = {value}
}
const RolesEnum = new GraphQLEnumType({
    name: 'UserRoles',
    values: roleValues,
})

然后,您可以直接将其分配为架构中的类型。

于 2017-10-27T08:20:20.477 回答
1

database如果您的枚举值是从一个或任何其他后端源加载的,或者如果枚举列表是dynamic,那么您的架构中不能有static枚举定义。

动态设置枚举的最大问题是您的模式是后端和前端之间的合同,并且不应该被更改。

如果您要将您的角色用作任意字符串,则将其定义为这样!

type Mutation {
  createUser(firstName: String, lastName: String, role: String): User
}

这里唯一的区别是您的解析器必须检查角色是否存在,这是 graphql 之前在您使用枚举时为您所做的。

或者

如果该角色用于大量查询/突变,您可以定义 ascalar Role并在已解析的标量中检查角色是否存在,如果不存在则简单地抛出错误。

在这种情况下,您的突变看起来就像您有一个动态的一样enum Role,但您根本不需要更改模式。

type Mutation {
  createUser(firstName: String, lastName: String, role: Role): User
}
于 2018-05-12T13:04:39.533 回答
1

使用字符串插值添加动态枚举和文档字符串。

示例:我有一个国家列表及其 ISO2 代码

const countryData = [
   {name:'India', code: 'IN'},
   {name:'Afghanistan', code: 'AF'},
   {name:'Algeria', code: 'DZ'},
   {name: 'Ireland', code: 'IE'
];

const countryCodes = countryData.flatMap(country => [
  `"${country.name}"`,
  country.code
]);

不使用Array.join()


enum CountryCode { ${countryCodes} }
于 2020-06-22T04:36:21.667 回答