Node.js+GraphQL+MongoDB+Flutter应用部署到Heroku后崩溃,启动时提示找不到GraphQL相关模块
Node.js+GraphQL+MongoDB+Flutter应用部署到Heroku后崩溃,启动时提示找不到GraphQL相关模块
伙计,别慌,这种隔了一年重启旧项目、更新依赖后踩坑的情况太常见了,咱们一步步来排查解决。
首先看你Heroku日志里的核心错误:
Error: Cannot find module '../polyfills/symbols.js'
这个问题90%是依赖版本不兼容导致的——你更新了所有依赖,但express-graphql和graphql的版本可能不匹配,旧版的express-graphql会依赖graphql里的一些旧文件,而新版graphql已经移除了这些文件(比如polyfills/symbols.js)。
第一步:修复GraphQL依赖兼容问题
锁定兼容的版本组合
打开你的package.json,把graphql和express-graphql改成经过验证的兼容版本。比如:- 如果继续用
express-graphql,可以搭配express-graphql@0.12.0+graphql@15.8.0 - 或者更推荐换掉已经被弃用的
express-graphql,改用apollo-server-express(维护更活跃,兼容性更好),只是需要你稍微调整下服务器代码。
- 如果继续用
清理本地依赖,重新安装
先删掉本地的依赖缓存,避免旧版本干扰:rm -rf node_modules package-lock.json npm install(如果用yarn,就删
node_modules yarn.lock然后跑yarn install)清除Heroku缓存,重新部署
Heroku有时候会缓存旧依赖,导致新依赖没正确安装,执行下面的命令清缓存再部署:heroku plugins:install heroku-repo heroku repo:purge_cache -a mvp-timelyst git commit --allow-empty -m "Purge Heroku cache" git push heroku main
第二步:解决本地node app.js的MongoDB认证错误
你说nodemon能启动,但直接跑node app.js会报MongoDB bad auth,这大概率是环境变量加载问题:
- nodemon可能自动加载了你的
.env文件,而直接跑node app.js时没有加载,导致MongoDB的用户名密码没正确读取。 - 解决办法:确保
app.js开头引入dotenv包并加载环境变量:
或者启动时手动加载:require('dotenv').config();node -r dotenv/config app.js - 另外检查MongoDB URI格式:如果是Atlas的URI,密码里的特殊字符(比如@、#、$)要做URL编码,比如
@换成%40。 - 最后检查驱动版本:如果更新了
mongoose或mongodb包,旧连接配置可以加上兼容选项:mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });
第三步:模拟器的GraphQL错误
这个问题是服务器没正常启动导致的,等前面两个问题解决后,服务器稳定运行了,模拟器的GraphQL请求就能正常响应,错误自然会消失。
按照上面的步骤一步步来,应该能解决你的问题,如果还有问题,可以再核对下Heroku的环境变量是否全部配置正确(比如MongoDB URI、端口这些)。
备注:内容来源于stack exchange,提问作者Maria Donosova
相关产品推荐
相关产品推荐

