Apollo Server报错:需传入schema/modules/typeDefs配置排查
问题根因
核心触发原因是ES模块导入导出不匹配,传入ApolloServer实例的schema实际为undefined,触发参数校验报错:
- 你的
schema.js中使用默认导出语法:export default schema; - 但
server.js中错误使用了命名导入写法:import {schema} from "./schema";
这种写法只会尝试读取模块内名为schema的命名导出,找不到对应值时会赋值为undefined,ApolloServer接收不到合法的schema实例,就会抛出你看到的缺少配置错误。
另外代码里还有2个隐藏语法问题,修完导入问题后如果不处理会继续触发运行报错:
users.typeDefs.js中gql标签写法错误,gql和模板字符串之间多了一个多余的双引号users.mutations.js的client导入语句末尾多了一个多余的双引号
修复方案
1. 修正server.js的schema导入逻辑
将命名导入改为默认导入,顺便清理未使用的冗余导入:
require ("dotenv").config(); import { ApolloServer } from "apollo-server"; // 去掉大括号,使用默认导入接收schema import schema from "./schema"; const server = new ApolloServer({ schema, }); const PORT = process.env.PORT server.listen(PORT).then(() => { console.log(`🚀 Server ready at http://localhost:${PORT} ✅ `); });
2. 修正users.typeDefs.js的gql语法
删除gql和反引号之间多余的双引号:
import { gql } from "apollo-server"; export default gql` type User { id: String! firstName: String! lastName: String username: String! email: String! createdAt: String! updatedAt: String! } type Mutation { createAccount( firstName: String! lastName: String username: String! email: String! password: String! ): User } type Query { seeProfile(username:String): User } `;
3. 修正users.mutations.js的导入语法
删除导入语句末尾多余的双引号:
import { PrismaClient } from "@prisma/client"; import client from "../client"; export default { Mutation: { createAccount: async ( _, { firstName, lastName, username, email, password } ) => { //check if username or email are already on DB. const existingUser = await client.user.findFirst({ where: { OR: [ { username, }, { email, } ], }, }); console.log(existingUser); // hash password // save and return the user }, }, };
改完以上三点后重启服务,ApolloServer就能正常读取合并后的schema实例,不会再抛出配置缺失错误。
内容的提问来源于stack exchange,提问作者Mr.Montez
相关产品推荐
相关产品推荐

