是啥导致了这个 Heroku mysql 连接错误? (尝试将前端连接到后端 POST 请求)
Posted
技术标签:
【中文标题】是啥导致了这个 Heroku mysql 连接错误? (尝试将前端连接到后端 POST 请求)【英文标题】:What is causing this Heroku mysql connection error? (Trying to connect frontend to backend POST request)是什么导致了这个 Heroku mysql 连接错误? (尝试将前端连接到后端 POST 请求) 【发布时间】:2021-11-17 05:03:05 【问题描述】:已解决。新错误
Heroku 日志中的错误:
Error: connect ECONNREFUSED 127.0.0.1:3306
2021-09-23T18:24:12.236657+00:00 app[web.1]: at TCPConnectWrap.afterConnect. [as oncomplete] (node:net:1146:16)
2021-09-23T18:24:12.236658+00:00 app[web.1]: errno: -111,
2021-09-23T18:24:12.236658+00:00 app[web.1]: code: 'ECONNREFUSED',
2021-09-23T18:24:12.236658+00:00 app[web.1]: syscall: 'connect',
2021-09-23T18:24:12.236659+00:00 app[web.1]: address: '127.0.0.1',
2021-09-23T18:24:12.236659+00:00 app[web.1]: port: 3306,
2021-09-23T18:24:12.236659+00:00 app[web.1]: fatal: true
信息/背景:
React js 前端(现在托管在 Netlifty 上) 使用 Express 和 mysql2 的 javascript 节点后端(托管在 Heroku 上)
目标: 将 Neflifty 前端 POST 请求与 Heroku 后端连接,获取 POST 有效负载数据并将其插入到 MYSQL 表中。
更新:2021 年 9 月 24 日
我已经完成了所有建议。我用 clearDB 创建了一个新数据库。添加它并在 mysql Workbench 中测试连接。创建了所需的表。更新了用于创建与新数据库的连接的后端代码。检查 heroko 变量并确保它们正确反映到新数据库。现在有一个授权问题。 已解决
带有更正的新后端代码:
const express = require('express');
const app = express();
const port = process.env.Port || 8000
app.listen(port);
console.log(`server is listing on $port`);
暂停
问题: 如果这在工作台上本地连接,如果将它们添加为变量,为什么 Heroku 不连接? 已回答
新问题: 为什么它应该使用环境时尝试使用端口 8000?为什么会超时?
对此的任何帮助将不胜感激。
【问题讨论】:
您在 Heroku 上使用的是哪个数据库插件? @JoãoFernandes 我没有使用任何数据库插件。我正在使用 Heroku CLI。要部署它,我只需使用 git push heroku main 推送代码。之后,当打开应用程序时,它会运行上面看到的节点 javascript。那是我检查日志的时候。如果有更简单的方法通过 Heroku 的插件之一运行 server.js 文件,我将有兴趣了解这种方法。 【参考方案1】:您无法连接到数据库,因为您没有在 Heroku 上运行任何数据库实例。使用 Heroku CLI 推送代码后,Heroku 会为您设置一个 NodeJS 应用程序,但这并不意味着它也会为您设置一个数据库。
您可以通过 Heroku 的界面或 CLI 将数据库添加到您的应用程序。从 CLI(我们将设置 ClearDB,但任何 MySQL 数据库插件都可以工作):
heroku addons:create cleardb:ignite
完成此操作后,您希望拥有新的数据库 URL(不会是 localhost):
heroku config | grep CLEARDB_DATABASE_URL
最后一条命令的输出类似于:
mysql://<user>:<password>@<host>/<database>?reconnect=true
现在,有了这个,您应该使用这些新信息稍微修改您的代码。您不想在版本控制中公开您的数据库凭据,因此您可以使用环境变量来完成它:
const db = mysql.createConnection(
connectionaLimit: 50,
user: process.env.DB_USER,
host: process.env.DB_HOST,
password: process.env.DB_PASSWORD,
database: process.env.DATABASE,
port: 3306
);
另外,您需要为正在运行的 Heroku 应用设置环境变量:
heroku config:set DB_USER=<user>
heroku config:set DB_PASSWORD=<password>
heroku config:set DB_HOST=<host>
heroku config:set DATABASE=<database>
现在,您有一个在 Heroku 上运行的数据库实例和一个可以连接到该数据库的 NodeJS 应用程序实例。
为了进一步阅读,您可能想看看这些链接:
https://lo-victoria.com/build-a-mysql-nodejs-crud-app-4-deploying-to-heroku-finale
https://www.bezkoder.com/deploy-node-js-app-heroku-cleardb-mysql/
https://raddy.co.uk/blog/how-to-deploy-node-js-express-ejs-mysql-website-on-heroku-cleardb/(这个用的是Heroku的接口)
【讨论】:
Fernandes :感谢这个解释清楚的答案。我还查看了您提供的链接,它们也很有帮助。我已经完成了您建议的所有操作,并在 mysql 工作台中创建了一个新数据库。由于我不知道的原因,我收到拒绝访问错误。对此有更多帮助会很好。我用更多信息和屏幕截图以及更新的代码更新了帖子。 @benholsinger 从您的DATABASE
环境变量中删除您的 ?reconnect=true
。小心分享您的凭据!任何看到您帖子的人现在都可以访问您的 Heroku 数据库。如果我是你,我会删除这个插件并重新添加到 Heroku 以更新你的凭据:)
@Fernandes 谢谢,这是个好建议。连接现在工作。感谢所有帮助。
@Ferandes 再次感谢您的帮助。如果你有更多的空闲时间,我还有一个问题。当我再次查看日志时,它似乎在尝试绑定端口时超时。我确定我有: app.listen (app is express) 设置为 process.env.Port || 8000. 所有资源似乎都验证了它是如何设置的。在日志中会发生这种情况: heroku[router]: at=error code=H20 desc="App boot timeout" method=GET path="/" host=fwd="65.144.6.34" Error R10 (Boot timeout) -> Web进程在启动后 60 秒内未能绑定到 $PORT
@benholsinger 环境变量区分大小写。只需更改为大写:process.env.PORT
。如果此答案解决了您的问题,您介意将其标记为已接受的答案吗?以上是关于是啥导致了这个 Heroku mysql 连接错误? (尝试将前端连接到后端 POST 请求)的主要内容,如果未能解决你的问题,请参考以下文章
是啥阻止了这个 rails/vue 项目部署到 heroku?