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