1

我有一个简单的 graphql 查询和一个指令

directive @isOwner(postID: String!) on FIELD_DEFINITION

type Query {
  post(postID: String!): Post! @isOwner(postID: postID)
}

问题是我正在使用GQLGen为 Go 生成我的样板代码,并且指令的处理方式与输入值不同。这提出了一个独特的挑战,授权逻辑几乎与实际的数据库读取隔离,这使得逻辑非常低效,因为我必须使数据库读取两次:在验证期间和实际的数据库读取。数据库读取也需要验证所需的数据,我必须编辑我的整个代码才能将这些数据注入到上下文中。有没有办法将输入参数动态传递给指令并动态完成验证,这首先是一个好的做法吗?

4

1 回答 1

2

传递给模式指令的参数在最初构建模式时进行评估,因此它们不能是动态的。在这种特殊情况下,您根本不需要参数——您只需读取字段参数的值即可。

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

但是,如果参数的名称因字段而异,那么您可以将作为参数传递给您的指令

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

于 2020-05-07T18:18:47.053 回答