将 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])
  }
}