проверить пропущенные распознаватели - PullRequest
0 голосов
/ 12 мая 2019

Как бы вы просканировали схему на предмет отсутствия распознавателя для запросов и нескалярных полей?

Я пытаюсь работать с динамической схемой, поэтому мне нужно иметь возможность проверить это программно. Я просматривал инструменты graphql в течение нескольких часов, чтобы найти способ сделать это, но у меня ничего не получается ...

  • checkForResolveTypeResolver - это относится только к интерфейсу и объединению resolTyol resolver
  • Я не могу найти способ узнать, когда применяется defaultFieldResolver
  • Я пытался работать с пользовательскими директивами, чтобы добавить @requiredResolver, чтобы помочь идентифицировать эти поля, но пользовательский распознаватель далеко не полностью поддерживается:

любая помощь приветствуется!

1 Ответ

2 голосов
/ 12 мая 2019

Учитывая экземпляр GraphQLSchema (т.е. что возвращает makeExecutableSchema) и ваш resolvers объект, вы можете просто проверить его самостоятельно. Примерно так должно работать:

const { isObjectType, isWrappingType, isLeafType } = require('graphql')

assertAllResolversDefined (schema, resolvers) {
  // Loop through all the types in the schema
  const typeMap = schema.getTypeMap()
  for (const typeName in typeMap) {
    const type = schema.getType(typeName)
    // We only care about ObjectTypes
    // Note: this will include Query, Mutation and Subscription
    if (isObjectType(type) && !typeName.startsWith('__')) {
      // Now loop through all the fields in the object
      const fieldMap = type.getFields()
      for (const fieldName in fieldMap) {
        const field = fieldMap[fieldName]
        let fieldType = field.type

        // "Unwrap" the type in case it's a list or non-null
        while (isWrappingType(fieldType)) {
          fieldType = fieldType.ofType
        }

        // Only check fields that don't return scalars or enums
        // If you want to check *only* non-scalars, use isScalarType
        if (!isLeafType(fieldType)) {
          if (!resolvers[typeName]) {
            throw new Error(
              `Type ${typeName} in schema but not in resolvers map.`
            )
          }
          if (!resolvers[typeName][fieldName]) {
            throw new Error(
              `Field ${fieldName} of type ${typeName} in schema but not in resolvers map.`
            )
          }
        }
      }
    }
  }
}
...