如何在graphql中为参数添加指令



我试图向我的模式添加一个指令,这样我就可以验证像本例中的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
}
}

最新更新