Apollo Graphql修改输入数据

时间:2019-10-18 21:45:45

标签: graphql apollo graphql-js apollo-server

在Apollo Server中,可以使用架构指令来实现解析器中间件,例如:

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

@hasRole(role: "ADMIN")充当中间件,以防止任何非管理员用户使用此突变。

那么如何对输入数据进行清理/转换?例如,

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

@transform将userId作为哈希ID(即:xyfd),并将其转换为带编号的ID(即:12)。当然不允许使用此语法。基本上,我想要一种在输入数据进入解析器之前对其进行修改的方法。

1 个答案:

答案 0 :(得分:1)

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

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

Schema指令不是中间件。它们只是更改架构内各个定义的方法。通常,它们用于更改 field 定义,但是您可以更改其他定义,例如对象类型,输入对象类型,枚举,联合等。在将指令与字段一起使用时,可以包装现有的在另一个函数内部解析功能(或完全替换它)-这样,我们可以为解析器创建“中间件”。但是,这不是架构指令的目的。

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

{{1}}