如何在自定义指令上触发 visitInputObject 方法?
How to trigger visitInputObject method on custom directive?
我正在构建一个自定义指令,我希望在其中验证整个输入对象。我在 SchemaDirectiveVisitor
extended class.
上使用 INPUT_OBJECT
类型和 visitInputObject
方法
每次我 运行 使用输入类型进行突变时 visitInputObject
不会 运行。
我使用了其他 types/methods,例如 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
的所有访问方法同时 运行 -- 在构建架构时。这包括 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]);
}
}
我正在构建一个自定义指令,我希望在其中验证整个输入对象。我在 SchemaDirectiveVisitor
extended class.
INPUT_OBJECT
类型和 visitInputObject
方法
每次我 运行 使用输入类型进行突变时 visitInputObject
不会 运行。
我使用了其他 types/methods,例如 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
的所有访问方法同时 运行 -- 在构建架构时。这包括 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]);
}
}