You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

改造graphql-typegraphql示例时出现graphqlError.toJSON is not a function错误

解决TypeError: graphqlError.toJSON is not a function错误

错误原因分析

这个错误主要由以下问题引发:

  1. Resolver数组混入非Resolver类型:你在buildSchema的resolvers中加入了PostCreateInput(这是输入DTO,并非Resolver类),导致TypeGraphQL生成的Schema存在异常,进而触发Apollo Server处理错误时的方法缺失。
  2. ScalarsMap配置错误:scalarsMap的type字段应指定TypeScript原生类型(如Date),而非GraphQLScalarType,错误的映射会导致Schema解析逻辑异常。
  3. 潜在依赖版本冲突: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:21:39