【问题标题】:Apollo Graphql modify input dataApollo Graphql 修改输入数据
【发布时间】:2020-02-15 21:45:05
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: graphql apollo graphql-js apollo-server


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是否可以将此指令附加到 ARGUMENT_DEFINITION 和 FIELD_DEFINITION ?我想为指令保留相同的名称
    • 您可以在两者上附加相同的指令,但 visitArgumentDefinition 只会让您转换参数定义。
    • 啊,我明白了,正确的语法是什么? directive @test on ARGUMENT_DEFINITION, INPUT_DEFINITION ?
    • nvm 它是一个管道|
    猜你喜欢
    • 2023-04-09
    • 2019-03-13
    • 2020-09-13
    • 1970-01-01
    • 2019-05-13
    • 2020-03-07
    • 2020-05-29
    • 2019-03-15
    相关资源
    最近更新 更多