Express Apollo Server合并typeDefs时触发got object错误如何解决
报错原因
这个报错是新版本@graphql-tools/load-files的加载逻辑和你当前的文件过滤规则冲突导致的:
你调用loadFilesSync的时候传入的是当前__dirname目录,且没有过滤文件后缀,所以会把当前目录下的index.js(也就是你现在写的这个合并文件本身)也加载到types数组里,数组里混入了JS模块导出的对象,传入mergeTypeDefs的时候就会触发类型不匹配的错误。旧版本依赖的加载规则对这类情况有兼容处理,重装依赖后拉到了新版本就会触发报错。
解决方法
你可以选择以下任意一种方案修改代码:
- 方案1:加载时排除当前index.js文件
const types = loadFilesSync(path.join(__dirname, '.'), { recursive: true, ignoreIndex: true // 新增这个参数,自动忽略index类的入口文件 })
- 方案2:指定只加载GraphQL后缀的文件,避免加载JS/TS文件
const types = loadFilesSync(path.join(__dirname, '.'), { recursive: true, extensions: ['graphql', 'gql'] // 只加载.graphql/.gql后缀的类型定义文件 })
- 方案3:如果你的类型定义是写在JS/TS文件里(用
gql标签包裹),则提取模块的默认导出内容:
const types = loadFilesSync(path.join(__dirname, '.'), { recursive: true, requireMethod: (path) => require(path).default // 直接取JS/TS模块的默认导出 })
如果修改后还是报错,可以先打印console.log(types)查看加载到的内容,确认是否还有非字符串/非DocumentNode的非法值混入。
内容的提问来源于stack exchange,提问作者Fozle Rabbi Shafi
相关产品推荐
相关产品推荐

