将Graphql输入参数传递给指令

将Graphql输入参数传递给指令,graphql,gqlgen,Graphql,Gqlgen,我有一个简单的graphql查询和一个指令 directive @isOwner(postID: String!) on FIELD_DEFINITION type Query { post(postID: String!): Post! @isOwner(postID: postID) } directive @isOwner(argName: String!) on FIELD_DEFINITION 问题是,我正在使用生成Go的样板代码,指令的处理方式与输入值不同。 这提出了一个独

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

directive @isOwner(postID: String!) on FIELD_DEFINITION

type Query {
  post(postID: String!): Post! @isOwner(postID: postID)
}
directive @isOwner(argName: String!) on FIELD_DEFINITION

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

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

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(postID: String!) on FIELD_DEFINITION

type Query {
  post(postID: String!): Post! @isOwner(postID: postID)
}
directive @isOwner(argName: String!) on FIELD_DEFINITION

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

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(postID: String!) on FIELD_DEFINITION

type Query {
  post(postID: String!): Post! @isOwner(postID: postID)
}
directive @isOwner(argName: String!) on FIELD_DEFINITION

问题是,我正在使用GQLGen为Go生成样板代码,指令的处理方式与输入值不同。我还修改了我的问题以进一步解释我的困境谢谢你详细的回答,我不确定我的案例是否可以挽救,尽管问题是我正在使用GQLGen生成Go的样板代码,指令的处理方式与输入值不同。我还修改了我的问题,以进一步解释我的困境。谢谢你详尽的回答,但我不确定我的案子是否可以挽救