如何使用GraphQL JavaScript包提取Schema中的单个查询?
使用GraphQL JavaScript包拆分Query字段的最优方法
可以借助官方的graphql核心包,通过解析Schema为AST(抽象语法树)并遍历处理,实现精准拆分。这种方法比正则表达式更可靠,能兼容所有合法的GraphQL语法。
步骤实现
- 安装依赖
npm install graphql
- 编写处理代码
const { parse, print, visit } = require('graphql'); // 你的原始Schema字符串 const rawSchema = ` type User { id: ID! name: String! email: String! age: Int posts: [Post!]! } type Post { id: ID! title: String! body: String! author: User! comments: [Comment!]! } type Comment { id: ID! body: String! author: User! post: Post! } type Query { users: [User!]! user(id: ID!): User posts: [Post!]! post(id: ID!): Post comments: [Comment!]! comment(id: ID!): Comment } `; // 解析Schema为AST const schemaAst = parse(rawSchema); const splitQuerySchemas = []; // 遍历AST找到Query类型定义 visit(schemaAst, { ObjectTypeDefinition(node) { if (node.name.value === 'Query') { // 逐个处理Query下的每个字段 node.fields.forEach((field, idx) => { // 构建仅包含当前字段的新Query类型AST const singleQueryAst = { ...schemaAst, definitions: [ { ...node, fields: [field] } ] }; // 将AST转换为格式化的Schema字符串 const querySchemaStr = print(singleQueryAst); splitQuerySchemas.push({ number: idx + 1, schema: querySchemaStr.trim() }); }); } } }); // 输出拆分结果(也可按需保存或使用) splitQuerySchemas.forEach(item => { console.log(`String ${item.number}`); console.log('```graphql'); console.log(item.schema); console.log('```\n'); });
代码说明
parse: 将原始Schema字符串转换为GraphQL的抽象语法树(AST),这是官方处理Schema的标准结构。visit: 遍历AST节点,精准定位到Query类型的定义节点,避免手动遍历的繁琐。- 字段拆分:对每个Query字段,复制原Query类型节点并仅保留当前字段,生成独立的AST结构。
print: 将新的AST转换回格式化的Schema字符串,确保输出的语法完全符合GraphQL规范。
这种方法能稳定处理各种复杂场景,比如带参数的字段、嵌套类型等,不会出现正则解析的遗漏或错误。
内容的提问来源于stack exchange,提问作者akashmohan
相关产品推荐
相关产品推荐

