GraphQL如何获取查询选中字段(如String、Int、ID等)的类型?
visit 方法仅会遍历 GraphQL 查询的抽象语法树(AST),查询本身不携带类型定义信息,必须结合对应的 Schema 实例才能获取字段类型。graphql 库提供了 TypeInfo 工具类,可在遍历 AST 的过程中自动跟踪当前节点的类型信息,具体实现如下:
1. 依赖导入
import { buildSchema, TypeInfo, visit, getNamedType } from 'graphql'; import { gql } from '@apollo/client';
2. 构造 Schema 实例
你需要先把本地 schema 文件的 SDL 内容转为可识别的 Schema 实例,示例如下:
// 示例SDL,实际场景可通过fs读取本地.graphql文件的内容传入 const schemaSDL = ` type User { firstName: String lastName: String } type Query { user: User } `; const schema = buildSchema(schemaSDL);
3. 结合TypeInfo遍历查询获取字段类型
// 你的查询语句 const GET_USER = gql` query user() { user { firstName lastName } } `; // 创建TypeInfo实例,传入构造好的schema const typeInfo = new TypeInfo(schema); // 遍历查询AST visit(GET_USER, typeInfo.getVisitor({ Field(node) { // 当前字段名 const fieldName = node.name.value; // 当前字段的完整类型(包含非空!、列表[]等修饰符) const fieldType = typeInfo.getType(); // 去掉修饰符的原始基础类型 const baseType = getNamedType(fieldType); console.log(`字段名:${fieldName}`); console.log(`完整类型:${fieldType.toString()}`); console.log(`基础类型名:${baseType.name}\n`); } }));
上述代码的输出结果如下:
字段名:user 完整类型:User 基础类型名:User 字段名:firstName 完整类型:String 基础类型名:String 字段名:lastName 完整类型:String 基础类型名:String
内容的提问来源于stack exchange,提问作者Eesa
相关产品推荐
相关产品推荐

