我正在构建一个自定义指令,希望在其中验证整个输入对象。我在扩展类INPUT_OBJECT
的visitInputObject
方法上使用类型SchemaDirectiveVisitor
。
每次我使用输入类型运行变异时visitInputObject
都不会运行。我已经使用了其他类型/方法visitObject
,visitFieldDefinition
并且它们运行完美。但是,当尝试使用输入类型和方法时,它们不会触发。
我已经阅读了所有可以找到的可用文档。现在还不支持吗?
一些上下文代码(不实际):
directive @validateThis on INPUT_OBJECT
input MyInputType @validateThis {
id: ID
someField: String
}
type Mutation {
someMutation(myInput: MyInputType!): SomeType
}
class ValidateThisDirective extends SchemaDirectiveVisitor {
visitInputObject(type) {
console.log('Not triggering');
}
}
SchemaDirectiveVisitor
构建架构时,同时运行a的所有访问方法。其中包括visitFieldDefinition
和visitFieldDefinition
。区别在于,当使用时visitFieldDefinition
,我们经常这样做以修改resolve
受访字段的功能。在执行过程中将调用此函数。
您可以使用每种访问方法来修改各自的架构元素。您可以visitInputObject
用来修改输入对象,例如从中添加或删除字段。您不能使用它来修改输出对象字段的解析逻辑。您应该使用visitFieldDefinition
它。
visitFieldDefinition(field, details) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (parent, args, context, info) {
Object.keys(args).forEach(argName => {
const argDefinition = field.args.find(a => a.name === argName)
// Note: you may have to "unwrap" the type if it's a list or non-null
const argType = argDefinition.type
if (argType.name === 'InputTypeToValidate') {
const argValue = args[argName]
// validate here
}
})
return resolve.apply(this, [parent, args, context, info]);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句