是啥导致了这个 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?

Heroku SSL 连接错误不支持的协议

是啥导致了这个推进错误?

Knex 与 Heroku Postgres 连接出现错误?

Python MySQLdb错误 - 是啥导致了这个

是啥导致了这个“jpackage 不存在”错误?