Apollo与GQL导入变量到gql模板字符串报错问题求助
报错原因及解决方案
报错原因
大概率是动态导入的字符串存在格式问题(比如多余的空格、不可见字符,或缩进不匹配),导致GraphQL解析器无法将其识别为Query类型下的有效字段,最终生成的schema里没有returnAlltags字段,但resolvers中已经定义了该字段,触发了不匹配报错。
虽然直接定义变量时内容看起来一致,但模板字符串与require导入的普通字符串在格式处理上可能存在细微差异(比如隐藏换行、编码问题),导致解析结果不同。
可行解决方案
方案1:修复字符串格式,确保拼接后的schema有效
先验证导入的字符串内容:
在主文件中添加打印语句,确认导入的字符串无异常:const tagqryTypeDefs = require('./src/mongodb/tag/tagGql'); console.log('导入的字符串内容:', JSON.stringify(tagqryTypeDefs));正常输出应为
" returnAlltags: [Tag] ",若存在多余换行、全角空格或其他异常字符,需修正tagGql文件里的字符串。统一缩进并清理多余空格:
导入时去除字符串前后空白字符,再手动添加匹配的缩进,保证schema格式正确:const tagqryTypeDefs = require('./src/mongodb/tag/tagGql').trim(); const typeDefs = gql` type Query { findAllUser: [User] ${tagqryTypeDefs} } `;
方案2:使用GraphQL的extend语法(推荐)
这种方式避免了字符串拼接的格式问题,是更规范的GraphQL类型扩展方式:
- 修改
tagGql文件,用gql标签定义扩展的Query类型:const { gql } = require('apollo-server'); // 根据你的GraphQL库调整导入 const tagqryTypeDefs = gql` extend type Query { returnAlltags: [Tag] } `; module.exports = tagqryTypeDefs; - 主文件中合并类型定义:
const tagqryTypeDefs = require('./src/mongodb/tag/tagGql'); const typeDefs = gql` type Query { findAllUser: [User] } ${tagqryTypeDefs} `;
方案3:使用类型定义合并工具(适用于多拆分schema)
若你的schema拆分较多,推荐使用@graphql-tools/merge工具合并所有类型定义,彻底避免手动拼接的问题:
- 安装依赖:
npm install @graphql-tools/merge - 修改
tagGql文件:const { gql } = require('apollo-server'); module.exports = gql` extend type Query { returnAlltags: [Tag] } `; - 主文件中合并:
const { mergeTypeDefs } = require('@graphql-tools/merge'); const baseTypeDefs = gql` type Query { findAllUser: [User] } `; const tagqryTypeDefs = require('./src/mongodb/tag/tagGql'); const typeDefs = mergeTypeDefs([baseTypeDefs, tagqryTypeDefs]);
内容的提问来源于stack exchange,提问作者GGG
相关产品推荐
相关产品推荐

