无法为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依赖一致
- 先查看apollo-server-express依赖的@types/express版本:
npm ls @types/express
输出会显示apollo-server-express子依赖的@types/express版本,比如@types/express@4.17.21。
- 安装对应版本的@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

