将 Graphql 输入参数传递给指令
Pass Graphql input arguement to directive
我有一个简单的 graphql 查询和一个指令
directive @isOwner(postID: String!) on FIELD_DEFINITION
type Query {
post(postID: String!): Post! @isOwner(postID: postID)
}
问题是我正在使用 GQLGen 生成我的 Go 样板代码,并且指令与输入值的处理方式不同。
这提出了一个独特的挑战,其中授权逻辑几乎与实际的数据库读取隔离开来,这使得逻辑效率非常低,因为我必须要么让数据库读取两次:在验证期间和实际的数据库读取期间。
数据库读取也需要验证所需的数据,我将不得不编辑我的整个代码以将此数据注入上下文。
有没有一种方法可以将输入参数动态传递给指令并动态完成验证,这首先是一种很好的做法吗?
传递给架构指令的参数在最初构建架构时进行评估,因此它们不能是动态的。在这种特殊情况下,您根本不需要参数——您可以只读取 字段的 参数的值。
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (parent, args, context, info) {
console.log(args.postID)
return resolve.apply(this, [parent, args, context, info])
}
}
但是,如果参数的名称因字段而异,那么您可以将 that 作为参数传递给您的指令
directive @isOwner(argName: String!) on FIELD_DEFINITION
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
const { argName } = this.args
field.resolve = async function (parent, args, context, info) {
console.log(args[argName])
return resolve.apply(this, [parent, args, context, info])
}
}
我有一个简单的 graphql 查询和一个指令
directive @isOwner(postID: String!) on FIELD_DEFINITION
type Query {
post(postID: String!): Post! @isOwner(postID: postID)
}
问题是我正在使用 GQLGen 生成我的 Go 样板代码,并且指令与输入值的处理方式不同。 这提出了一个独特的挑战,其中授权逻辑几乎与实际的数据库读取隔离开来,这使得逻辑效率非常低,因为我必须要么让数据库读取两次:在验证期间和实际的数据库读取期间。 数据库读取也需要验证所需的数据,我将不得不编辑我的整个代码以将此数据注入上下文。 有没有一种方法可以将输入参数动态传递给指令并动态完成验证,这首先是一种很好的做法吗?
传递给架构指令的参数在最初构建架构时进行评估,因此它们不能是动态的。在这种特殊情况下,您根本不需要参数——您可以只读取 字段的 参数的值。
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (parent, args, context, info) {
console.log(args.postID)
return resolve.apply(this, [parent, args, context, info])
}
}
但是,如果参数的名称因字段而异,那么您可以将 that 作为参数传递给您的指令
directive @isOwner(argName: String!) on FIELD_DEFINITION
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
const { argName } = this.args
field.resolve = async function (parent, args, context, info) {
console.log(args[argName])
return resolve.apply(this, [parent, args, context, info])
}
}