从 Heroku 上的 Node.js 连接到 CloudSQL

Posted

技术标签:

【中文标题】从 Heroku 上的 Node.js 连接到 CloudSQL【英文标题】:Connecting to CloudSQL from Node.js on Heroku 【发布时间】:2020-04-05 13:20:52 【问题描述】:

我有一个连接到 GCP CloudSQL (mysql) 实例的 Node.js 应用程序(在 AppEngine 上运行)。现在我想从运行在 Heroku 上的 Node.js (Knex) 连接到同一个数据库。

从 AppEngine,Node.js 通过用户/密码和 socketPath 连接。我还通过主机 IP(通过 SSL)从 MySQL Workbench 连接到同一个 MySQL DB。

我正在尝试使用与 Heroku 中的 Workbench 相同的主机、端口、用户和传递,但它无法正常工作。为方便起见,我暂时允许所有网络连接 (0.0.0.0/0) 并允许非 SSL 连接。

这是错误:ER_ACCESS_DENIED_ERROR: Access denied for user 'usernamehere'@'xx.xxx.xxx.xx' (using password: YES)"

环境变量存储在 Heroku 应用程序中,它们必须工作,因为用户名是正确的。

这不是很有帮助,但这里是代码:

import Knex = require('knex');
const envConfig = require('../config/environments').get(process.env.NODE_ENV);
module.exports = knex;

【问题讨论】:

您收到的错误消息是 MySQL 请验证您的连接信息是否正常。 here 发生了同样的问题,有一些解决方法 这能回答你的问题吗? NodeJS/mySQL - ER_ECCESS_DENIED_ERROR Access denied for user 'root'@'localhost' (using password: YES) @JoséSoní 不,很遗憾没有。我已经解决了这些建议,但新用户、新通行证和 npm 包更新问题仍然存在。 你是如何连接到 cloudSQl 的,如果你在 cloudSQL 端获取日志,你能分享一下吗? 【参考方案1】:

我发现解决此问题的唯一方法是通过 SSL 连接到 CloudSQL。

const mysql = require("mysql");
const fs = require('fs');
const knex = require('knex')(
    client: 'mysql',
    version: '5.7',
    connection: 
      host : 'xx.xx.xx.xx',
      ssl: 
        ca: fs.readFileSync('ca.pem'),
        key: fs.readFileSync('client-key.pem'),
        cert: fs.readFileSync('client-cert.pem'),
      ,
      user : 'root',
      password : 'xxxxxxxxx',
      database : 'mydbname',
    ,
);

【讨论】:

您在哪里/如何生成要传递给 ssl 配置的文件? 我在 GCP 控制台中生成了凭据。 对不起,你介意把我链接到哪里。我曾尝试创建一个服务帐户,但这只允许我下载一个密钥文件,而不是其他两个 pem。谢谢。 当然...转到console.cloud.google.com/sql/instances,选择您的实例,然后转到连接。在“连接”下,您会找到配置 SSL 的选项,包括“创建客户端证书”。

以上是关于从 Heroku 上的 Node.js 连接到 CloudSQL的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

Node.js 无法从 Heroku 连接到 mongodb 3 到 Mongolab:SCRAM-SHA-1

从 Heroku 连接到 MongoDb 时应用程序超时

无法在 heroku 上使用 node.js 连接到 mongolab

使用 sequelize ORM 连接到 node.js 上的 Amazon RDS Postgres 数据库的问题

如何在 Mongoose 上将 MongoDB 连接到 Heroku?