检查缺少的解析器

Posted

技术标签:

【中文标题】检查缺少的解析器【英文标题】:check for missing resolvers 【发布时间】:2019-09-29 09:41:26 【问题描述】:

您将如何扫描架构以查找缺少的解析器以查找查询和非标量字段?

我正在尝试使用动态架构,因此我需要能够以编程方式对其进行测试。我已经浏览了几个小时的 graphql 工具来寻找一种方法来做到这一点,但我无处可去......

checkForResolveTypeResolver - 这仅适用于 interface 和 union resolveType 解析器 我找不到知道何时应用 defaultFieldResolver 的方法 我尝试使用自定义指令添加 @requiredResolver,以帮助识别这些字段,但自定义解析器远未得到完全支持: introspection & directives no graphql-js directives handler(可以使用 graphql-tools 解决这个问题)

感谢任何帮助!

【问题讨论】:

【参考方案1】:

给定一个 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.`
            )
          
        
      
    
  

【讨论】:

我修复了丢失的逻辑,但除此之外,它工作得很好!我不知道这些花哨的方法(isObjectType、isWrappingType、isLeafType)。文档不是很好...谢谢!

以上是关于检查缺少的解析器的主要内容,如果未能解决你的问题,请参考以下文章

借用可以委派的解析器的检查器问题

Mysql流程解析

如何检查我的 ifunc 解析器中是不是有 BMI2 指令?

如何修复解析器错误消息:无法加载类型?

通用日志解析器算法

项目中没有解析`runBlocking`协程构建器(其他构建器已解决)