改造graphql-typegraphql示例时出现graphqlError.toJSON is not a function错误
解决TypeError: graphqlError.toJSON is not a function错误
错误原因分析
这个错误主要由以下问题引发:
- Resolver数组混入非Resolver类型:你在
buildSchema的resolvers中加入了PostCreateInput(这是输入DTO,并非Resolver类),导致TypeGraphQL生成的Schema存在异常,进而触发Apollo Server处理错误时的方法缺失。 - ScalarsMap配置错误:
scalarsMap的type字段应指定TypeScript原生类型(如Date),而非GraphQLScalarType,错误的映射会导致Schema解析逻辑异常。 - 潜在依赖版本冲突:Apollo Server 4要求
graphql版本≥16.6.0,需确保TypeGraphQL与该版本兼容。
修正步骤及代码
1. 修正核心代码错误
修改src/index.ts中的关键问题点:
- 从
resolvers数组移除PostCreateInput - 修正
scalarsMap的类型映射规则 - 确保
expressMiddleware传入正确的上下文处理函数
修正后的完整代码:
import 'reflect-metadata' import * as tq from 'type-graphql' import { PostResolver, SortOrder } from './PostResolver' import { UserResolver } from './UserResolver' import { ApolloServer } from '@apollo/server'; import { expressMiddleware } from '@apollo/server/express4'; import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer' import express from 'express'; import http from 'http'; import bodyParser from 'body-parser'; import { DateTimeResolver } from 'graphql-scalars' import { context } from './context' import cors from 'cors' const app2 = async () => { tq.registerEnumType(SortOrder, { name: 'SortOrder', }); const schema = await tq.buildSchema({ resolvers: [PostResolver, UserResolver], // 移除非Resolver的PostCreateInput scalarsMap: [{ type: Date, scalar: DateTimeResolver }], // 修正为TS原生Date类型映射 }); const app = express(); const httpServer = http.createServer(app); // Set up Apollo Server const server = new ApolloServer({ schema, plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); await server.start(); app.use( '/', cors<cors.CorsRequest>(), bodyParser.json(), // 传入上下文处理函数,确保Resolver能获取到上下文 expressMiddleware(server, { context: async ({ req, res }) => context({ req, res }), }), ); await new Promise<void>((resolve) => httpServer.listen({ port: 9000 }, resolve)); console.log(`🚀 Server ready at http://10.0.0.212:9000`) } app2()
2. 验证依赖版本
确保package.json中的核心依赖版本兼容:
{ "dependencies": { "@apollo/server": "^4.10.0", "graphql": "^16.8.1", "type-graphql": "^2.0.0-beta.2", "prisma": "^5.10.0" // 其他依赖保持原有配置即可 } }
若版本不匹配,执行npm install更新依赖。
3. 重启服务
删除node_modules和package-lock.json(可选),重新安装依赖后启动服务,错误即可解决。
内容的提问来源于stack exchange,提问作者Darknumbers
相关产品推荐
相关产品推荐

