我试图向我的模式添加一个指令,这样我就可以验证像本例中的id
这样的参数
type Query {
subject(id: ID): Subject
}
因此,基本想法是添加一个这样的指令,它在模式编译的意义上起作用:
directive @validate on ARGUMENT_DEFINITION | FIELD_DEFINITION
type Subject {
id: String @validate
}
type Query {
subject(id: ID! @validate): Subject
}
class InputValidationDirective extends SchemaDirectiveVisitor {
visitArgumentDefinition(field) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (...args) {
const result = await resolve.apply(this, args)
console.log(result) // never happen
return result
}
}
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (...args) {
const result = await resolve.apply(this, args)
console.log(result)
return result
}
}
}
但当我尝试使用它时,它似乎永远不会在传入的查询中找到,不像Subject
上的FIELD_DEFINITION
会被访问者击中:
u必须用其他参数调用visitArgumentDefinition
,@参见此处
visitArgumentDefinition(argument, objectType) {
const { resolve = defaultFieldResolver } = objectType.field
objectType.field.resolve = async (...args) => {
const result = await resolve.apply(this, args)
console.log(result) // never happen
return result
}
}