Как вызвать метод visitInputObject для пользовательской директивы? - PullRequest
1 голос
/ 04 марта 2020

Я создаю пользовательскую директиву, в которой я надеюсь проверить все входные объекты. Я использую тип 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');
  }
}

1 Ответ

0 голосов
/ 04 марта 2020

Все методы посещения SchemaDirectiveVisitor запускаются одновременно - при построении схемы. Это включает в себя visitFieldDefinition и visitFieldDefinition. Разница в том, что когда мы используем visitFieldDefinition, мы часто делаем это, чтобы изменить функцию resolve для посещаемого поля. Именно эта функция вызывается во время выполнения.

Вы используете каждый метод посещения для изменения соответствующего элемента схемы. Вы можете использовать visitInputObject для изменения объекта ввода, например, для добавления или удаления полей из него. Вы не можете использовать его для изменения логики разрешения c поля выходного объекта. Вы должны использовать 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]);
  }
}
...