Apollo Graphql修改输入数据

Apollo Graphql修改输入数据,graphql,apollo,graphql-js,apollo-server,Graphql,Apollo,Graphql Js,Apollo Server,在Apollo Server中,可以使用模式指令来实现以下解析器中间件: adminGetUsers(getUsersPL: GetUsersPL!): [User] @hasRole(role: "ADMIN") @hasRole(role:“ADMIN”)充当中间件,以防止任何非管理员用户使用此变体 那么,如何清理/转换输入数据呢?比如说, getUser(userId: String! @transform): [User] @transform将用户id作为散列id(即:xyfd),

在Apollo Server中,可以使用模式指令来实现以下解析器中间件:

adminGetUsers(getUsersPL: GetUsersPL!): [User] @hasRole(role: "ADMIN")
@hasRole(role:“ADMIN”)
充当中间件,以防止任何非管理员用户使用此变体

那么,如何清理/转换输入数据呢?比如说,

getUser(userId: String! @transform): [User]
@transform
将用户id作为散列id(即:
xyfd
),并将其转换为编号id(即:
12
)。当然,这种语法是不允许的。基本上,我想要一种在输入数据进入解析器之前修改输入数据的方法。

这实际上是有效的语法。您可以定义一个应用于参数定义的指令,如下所示:

directive @test on ARGUMENT_DEFINITION

type Query {
  foo(input: String @test): String
}
模式指令不是中间件。它们只是改变模式中单个定义的方法。最常见的是,它们用于更改字段定义,但您可以更改其他定义,如对象类型、输入对象类型、枚举、联合等。当对字段使用指令时,您可以将现有的解析函数包装到另一个函数中(或将其完全替换)——这样,我们可以为解析程序创建“中间件”。然而,这不是模式指令的目的

除此之外,您不能使用参数指令来更改参数传递的值。充其量,您可以将参数的类型更改为其他类型(如自定义标量)。但是,您可以使用字段指令来完成您要完成的任务:

class ExampleDirective extends SchemaDirectiveVisitor {
  public visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field
    field.resolve = async function (
      source,
      args,
      context,
      info,
    ) {
      args.someArg = doSomething(args.someArg)
      return resolve.call(this, source, args, context, info);
    }
  }
}

是否可以将此指令附加到参数定义和字段定义?我希望保留相同的指令名称您可以在这两个指令上附加相同的指令,但visitArgumentDefinition只允许您转换参数定义。啊,我明白了,这方面的正确语法是什么<代码>指令@test on ARGUMENT_DEFINITION,INPUT_DEFINITION?nvm其a管道
|