在heroku上部署后无法读取mongo数据库,返回503错误,但它在本地工作

Posted

技术标签:

【中文标题】在heroku上部署后无法读取mongo数据库,返回503错误,但它在本地工作【英文标题】:Can't read mongo database after deployment on heroku, returns 503 error, but it works locally 【发布时间】:2019-11-10 14:14:35 【问题描述】:

在我的 server.js 上执行 npm run build 并修复路径错误后,它在 localhost 中运行良好。但是一旦我将它部署到 Heroku,数据就不会收费,并且最终会在 chrome 控制台中显示这些消息:

加载资源失败:服务器响应状态为 503(服务不可用)

这之后是另一个错误:

Uncaught (in promise) SyntaxError: Unexpected token

我猜第一个错误与路由有关,因为它试图获取数据并且服务器响应是 503,我猜第二个错误仍然与我的 server.js 文件上静态文件的使用路径有关.

代码可在此处获得:https://github.com/pepdbm7/Meetup-with-Vue

我已经为第一个错误尝试的是:更改客户端的路由(添加 herokuapp url 作为每个 fetch() 的根 url),以及服务器端路由,但没有帮助。

它像现在一样在本地完美运行,这就是我不明白的。

...对于第二个错误,我将路径更改为:res.sendFile(path.join(__dirname, "client/dist")) 和:app.use(express.static("client/dist"));,并且我已经尝试过其他方式,但由于无法访问,它根本不起作用到缩小的 js 和 css 文件。

作为附加信息,我在部署时确实控制了 heroku 日志,这是结果日志,我没有看到重大错误,只是警告,也许我在这里遗漏了一些东西:

2019-06-28T15:32:25.610341+00:00 app[api]: Deploy d1938a6e by user pepdbm7@gmail.com
2019-06-28T15:32:25.610341+00:00 app[api]: Release v17 created by user pepdbm7@gmail.com
2019-06-28T15:32:26.000000+00:00 app[api]: Build succeeded
2019-06-28T15:32:27.448688+00:00 heroku[web.1]: Restarting
2019-06-28T15:32:27.765993+00:00 heroku[web.1]: State changed from up to starting
2019-06-28T15:32:28.597600+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2019-06-28T15:32:28.706141+00:00 heroku[web.1]: Process exited with status 143
2019-06-28T15:32:32.750630+00:00 heroku[web.1]: Starting process with command `npm start`
2019-06-28T15:32:34.977483+00:00 app[web.1]: 
2019-06-28T15:32:34.977500+00:00 app[web.1]: > meetup_app_vue@1.0.0 start /app
2019-06-28T15:32:34.977501+00:00 app[web.1]: > nodemon server.js
2019-06-28T15:32:34.977502+00:00 app[web.1]: 
2019-06-28T15:32:35.398126+00:00 app[web.1]: [33m[nodemon] 1.19.1[39m
2019-06-28T15:32:35.399744+00:00 app[web.1]: [33m[nodemon] to restart at any time, enter `rs`[39m
2019-06-28T15:32:35.400250+00:00 app[web.1]: [33m[nodemon] watching: *.*[39m
2019-06-28T15:32:35.401055+00:00 app[web.1]: [32m[nodemon] starting `node server.js`[39m
2019-06-28T15:32:36.388146+00:00 heroku[web.1]: State changed from starting to up
2019-06-28T15:32:35.987818+00:00 app[web.1]: node environment is production
2019-06-28T15:32:35.993171+00:00 app[web.1]: meetup_app_vue 1.0.0 up and running on port 40353
2019-06-28T15:32:35.994993+00:00 app[web.1]: (node:36) UnhandledPromiseRejectionWarning: MongoParseError: Invalid connection string
2019-06-28T15:32:35.994996+00:00 app[web.1]:     at parseConnectionString (/app/node_modules/mongodb-core/lib/uri_parser.js:505:21)
2019-06-28T15:32:35.994998+00:00 app[web.1]:     at connect (/app/node_modules/mongodb/lib/operations/mongo_client_ops.js:195:3)
2019-06-28T15:32:35.994999+00:00 app[web.1]:     at connectOp (/app/node_modules/mongodb/lib/operations/mongo_client_ops.js:284:3)
2019-06-28T15:32:35.995001+00:00 app[web.1]:     at executeOperation (/app/node_modules/mongodb/lib/utils.js:416:24)
2019-06-28T15:32:35.995002+00:00 app[web.1]:     at MongoClient.connect (/app/node_modules/mongodb/lib/mongo_client.js:175:10)
2019-06-28T15:32:35.995004+00:00 app[web.1]:     at Promise (/app/node_modules/mongoose/lib/connection.js:554:12)
2019-06-28T15:32:35.995006+00:00 app[web.1]:     at new Promise (<anonymous>)
2019-06-28T15:32:35.995007+00:00 app[web.1]:     at NativeConnection.Connection.openUri (/app/node_modules/mongoose/lib/connection.js:551:19)
2019-06-28T15:32:35.995009+00:00 app[web.1]:     at Mongoose.connect (/app/node_modules/mongoose/lib/index.js:289:15)
2019-06-28T15:32:35.995010+00:00 app[web.1]:     at Object.<anonymous> (/app/server.js:23:4)
2019-06-28T15:32:35.995012+00:00 app[web.1]:     at Module._compile (internal/modules/cjs/loader.js:776:30)
2019-06-28T15:32:35.995013+00:00 app[web.1]:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
2019-06-28T15:32:35.995015+00:00 app[web.1]:     at Module.load (internal/modules/cjs/loader.js:653:32)
2019-06-28T15:32:35.995016+00:00 app[web.1]:     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
2019-06-28T15:32:35.995017+00:00 app[web.1]:     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
2019-06-28T15:32:35.995019+00:00 app[web.1]:     at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)
2019-06-28T15:32:35.995111+00:00 app[web.1]: (node:36) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)
2019-06-28T15:32:35.995194+00:00 app[web.1]: (node:36) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

不管它是什么,它必须是一个非常简单的东西,但我已经花了几天时间找到它,所以任何线索都会非常受欢迎!

编辑:正如一些 cmets 所说,我不得不将环境变量放在 heroku 上,我只是错过了或者我没有正确命名。谢谢!!

【问题讨论】:

有几件事:(a) 您可能不应该在生产中使用nodemon,但这不是您的错误的原因。 (b) 错误消息显示MongoParseError: Invalid connection string。请edit您的问题并向我们展示您的连接代码。 我假设您的 MongoDB 托管在云中?如上需要查看你的连接代码 另外我假设你已经在 Heroku 上为你的 MongoDB 设置了环境变量? 您在 heroku 设置中的 Config Vars 中的 MONGO_URL 环境变量中似乎缺少连接字符串或连接字符串无效。 它无法与 mongodb 连接,我猜它没有得到正确的 url。您是否在 heroku 上创建/上传了 .env 文件? 【参考方案1】:

正如我所料,它必须是一个简单的解决方案问题,而且确实如此。正如一些 cmets 所说,我只需要在 Heroku Settings 中的 Config Vars 中更新环境变量!现在工作正常!!

非常感谢!

【讨论】:

以上是关于在heroku上部署后无法读取mongo数据库,返回503错误,但它在本地工作的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在本地连接到mongo,但是在heroku上部署时似乎会话创建失败

使用 Mongo Cloud 从部署在 Heroku 上的 Strapi 获取数据到 ReactJs

在heroku上成功部署后Rails应用程序无法正常工作?

Socket.io 在 localhost 上工作,但在部署 heroku 后无法工作?

在 Heroku 上为 Mongo Labs 数据库配置 Node.js 连接字符串

Heroku 节点 js 部署问题:Web 进程在启动后 60 秒内无法绑定到 $PORT