Apollo Graphql 修改输入数据

Apollo Graphql modify input data

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

adminGetUsers(getUsersPL: GetUsersPL!): [User] @hasRole(role: "ADMIN")

@hasRole(role: "ADMIN") 用作中间件以防止任何非管理员用户使用此更改。

那么 sanitize/transform 如何输入数据呢?例如,

getUser(userId: String! @transform): [User]

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

实际上 有效语法。您可以像这样定义一个应用于参数定义的指令:

directive @test on ARGUMENT_DEFINITION

type Query {
  foo(input: String @test): String
}

架构指令不是中间件。它们只是改变模式中的个别定义的方法。它们最常用于更改 field 定义,但您可以更改其他定义,例如对象类型、输入对象类型、枚举、联合等。使用带有字段的指令时,您可以将现有的解析函数包装在另一个函数中(或完全替换它)——这样做,我们可以为解析器创建 "middleware"。但是,这不是模式指令的目的。

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

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