在Apollo Server中,可以使用架构指令来实现解析器中间件,例如:
adminGetUsers(getUsersPL: GetUsersPL!): [User] @hasRole(role: "ADMIN")
@hasRole(role: "ADMIN")
充当中间件,以防止任何非管理员用户使用此突变。
那么如何对输入数据进行清理/转换?例如,
getUser(userId: String! @transform): [User]
@transform
将userId作为哈希ID(即:xyfd
),并将其转换为带编号的ID(即:12
)。当然不允许使用此语法。基本上,我想要一种在输入数据进入解析器之前对其进行修改的方法。
答案 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}}