NodeJs GraphQL 枚举类型值为动态
NodeJs GraphQL enum type value as dynamic
https://launchpad.graphql.com/9qvqz3v5r
这是我的示例 graphQL 架构。我正在尝试使用枚举类型。我如何从后端获取枚举值并将其输入架构?
// 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
}
`;
我想从动态变量中填充 enum 角色 值作为
const roleData = ['writer','reader','author','admin','superAdmin'];
谁能帮帮我?
您可以简单地使用字符串插值:
// 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,
})
然后您可以将其直接指定为架构中的类型。
如果您的枚举值是从 database
或任何其他后端源加载的,或者如果枚举列表是 dynamic
,那么您不能有 static
架构中的枚举定义。
动态设置枚举的最大问题是您的模式是后端和前端之间的契约,不应更改。
如果您打算将您的角色用作任意字符串,那么就这样定义它!
type Mutation {
createUser(firstName: String, lastName: String, role: String): User
}
这里唯一的区别是您的解析器必须检查该角色是否存在,这是 graphql 之前在您使用枚举时为您所做的。
或者
如果该角色用于大量查询/突变,您可以定义一个 scalar Role
并在标量的解析中检查该角色是否存在,如果不存在则简单地抛出错误' t.
在这种情况下,您的变更看起来与动态变更相同 enum Role
,但您根本不需要更改架构。
type Mutation {
createUser(firstName: String, lastName: String, role: Role): User
}
使用字符串插值添加动态枚举和文档字符串。
示例:我有一个国家列表及其 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} }
https://launchpad.graphql.com/9qvqz3v5r
这是我的示例 graphQL 架构。我正在尝试使用枚举类型。我如何从后端获取枚举值并将其输入架构?
// 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
}
`;
我想从动态变量中填充 enum 角色 值作为
const roleData = ['writer','reader','author','admin','superAdmin'];
谁能帮帮我?
您可以简单地使用字符串插值:
// 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,
})
然后您可以将其直接指定为架构中的类型。
如果您的枚举值是从 database
或任何其他后端源加载的,或者如果枚举列表是 dynamic
,那么您不能有 static
架构中的枚举定义。
动态设置枚举的最大问题是您的模式是后端和前端之间的契约,不应更改。
如果您打算将您的角色用作任意字符串,那么就这样定义它!
type Mutation {
createUser(firstName: String, lastName: String, role: String): User
}
这里唯一的区别是您的解析器必须检查该角色是否存在,这是 graphql 之前在您使用枚举时为您所做的。
或者
如果该角色用于大量查询/突变,您可以定义一个 scalar Role
并在标量的解析中检查该角色是否存在,如果不存在则简单地抛出错误' t.
在这种情况下,您的变更看起来与动态变更相同 enum Role
,但您根本不需要更改架构。
type Mutation {
createUser(firstName: String, lastName: String, role: Role): User
}
使用字符串插值添加动态枚举和文档字符串。
示例:我有一个国家列表及其 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} }