3

我正在构建一个自定义指令,希望在其中验证整个输入对象。我在扩展类上使用INPUT_OBJECT带有visitInputObject方法的类型。SchemaDirectiveVisitor

每次我使用输入类型运行突变时visitInputObject都不会运行。我已经使用了其他类型/方法,例如visitObjectandvisitFieldDefinition并且它们工作得很好。但是当尝试使用输入类型和方法时,它们不会触发。

我已经阅读了我能找到的所有可用文档。这还不支持吗?

一些上下文代码(不是实际的):

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');
  }
}
4

1 回答 1

0

a 的所有访问方法SchemaDirectiveVisitor都是同时运行的——在构建模式时。这包括visitFieldDefinitionvisitFieldDefinition。不同的是,我们在使用的时候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]);
  }
}
于 2020-03-04T00:38:54.767 回答