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

无法为Apollo Server应用中间件:Express类型不兼容报错

问题场景与报错

我尝试用以下代码搭建服务:

import express, { Application } from 'express';
import { ApolloServer } from 'apollo-server-express';
import { buildSchema } from 'type-graphql';

async function startServer() {
  const app: Application = express(); // 因报错尝试转为Application类型
  await connectDatabase();

  const apolloServer = new ApolloServer({
    schema: await buildSchema({
      resolvers: [UserResolver],
      authChecker,
    }),
    context: ({ req }) => {
      const headers = req.headers;
      return { headers };
    },
  });

  await apolloServer.start();
  apolloServer.applyMiddleware({ app });

  app.listen(4000, () => {
    console.log('Server started on http://localhost:4000/graphql');
  });
}

执行npm update后出现类型错误:

'import("node_modules/@types/express/index").Application'
无法赋值给类型
'import("node_modules/apollo-server-express/node_modules/@types/express/index").Application'。
属性'get'的类型不兼容。
ApolloServer.d.ts(15, 5): 预期类型来自'ServerRegistration'类型上声明的属性'app'

此前相同依赖的项目无此报错,update后两个项目都出现问题。项目依赖如下:

"dependencies": {
  "@typegoose/typegoose": "^12.0.0",
  "apollo-server-express": "^3.13.0",
  "bcrypt": "^5.1.1",
  "class-transformer": "^0.5.1",
  "class-validator": "^0.14.1",
  "dotenv": "^16.3.1",
  "express": "^4.18.2",
  "express-jwt-authz": "^2.4.1",
  "express-oauth2-jwt-bearer": "^1.6.0",
  "graphql": "^15.8.0",
  "jsonwebtoken": "^9.0.2",
  "jwks-rsa": "^3.1.0",
  "jwt-decode": "^4.0.0",
  "mongoose": "^8.0.4",
  "nodemailer": "^6.9.8",
  "reflect-metadata": "^0.2.1",
  "type-graphql": "^1.1.1"
},
"devDependencies": {
  "@types/bcrypt": "^5.0.2",
  "@types/jsonwebtoken": "^9.0.5",
  "@types/nodemailer": "^6.4.14",
  "typescript": "^5.3.3"
}
问题原因

这是类型依赖版本冲突导致的:apollo-server-express v3内部依赖的@types/express版本,和项目根目录安装的@types/express版本不一致,TypeScript无法识别这两个不同路径下的Application类型为同一类型。

解决方法

方法1:锁定@types/express版本与apollo依赖一致

  1. 先查看apollo-server-express依赖的@types/express版本:
npm ls @types/express

输出会显示apollo-server-express子依赖的@types/express版本,比如@types/express@4.17.21。

  1. 安装对应版本的@types/express到项目:
npm install @types/express@4.17.21 --save-dev

替换成你实际查到的版本号。

方法2:用npm overrides强制统一依赖版本

如果你的npm版本在8.3以上,可以在package.json中添加overrides字段,强制让apollo-server-express使用项目根目录的@types/express版本:

"overrides": {
  "apollo-server-express": {
    "@types/express": "$@types/express"
  }
}

添加后执行npm install重新安装依赖。

方法3:升级到Apollo Server v4(推荐长期方案)

apollo-server-express v3已经停止维护,官方推荐升级到@apollo/server(v4),它对新版express的兼容性更好。升级需要调整部分代码:

  • 替换依赖:移除apollo-server-express,安装@apollo/server和适配包:
npm uninstall apollo-server-express
npm install @apollo/server express graphql cors
  • 修改启动代码示例:
import express from 'express';
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import { buildSchema } from 'type-graphql';

async function startServer() {
  const app = express();
  await connectDatabase();

  const schema = await buildSchema({
    resolvers: [UserResolver],
    authChecker,
  });

  const apolloServer = new ApolloServer({ schema });
  await apolloServer.start();

  app.use('/graphql', express.json(), expressMiddleware(apolloServer, {
    context: async ({ req }) => ({ headers: req.headers }),
  }));

  app.listen(4000, () => {
    console.log('Server started on http://localhost:4000/graphql');
  });
}

内容的提问来源于stack exchange,提问作者Anouer Kassaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:22:25