【问题标题】:Cannot connect to MySQL db with nodejs (openshift app)无法使用 nodejs 连接到 MySQL 数据库(openshift 应用程序)
【发布时间】:2014-04-04 20:51:07
【问题描述】:

我有一个 nodejs(带有 express)openshift 应用程序,它有一个 MySQL 数据库(因为这是我最熟悉的),我不知道如何在本地环境中连接到它。我的上一个项目是使用带有 mamp 的 php 框架连接到本地数据库。节点的等价物是什么?这是我必须连接的代码:

 var mysql = require('mysql');

 var connection = mysql.createConnection({
  host     : '127.0.0.1',
  port     : '3307',
  database : 'test'

});

 connection.connect( function(err){
if (err){ 
    throw err;
}
else {
    console.log('Connected');
}
 });

这是尝试本地连接时的错误:

 Error: connect ETIMEDOUT
    at errnoException (net.js:901:11)
    at Object.afterConnect [as oncomplete] (net.js:892:19)
    --------------------
    at Protocol._enqueue (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:110:26)
    at Protocol.handshake (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:42:41)
    at Connection.connect (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/Connection.js:98:18)
    at Object.<anonymous> (/Users/brandonmoffitt/stembudsnode/server.js:16:12)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)

我猜是因为我试图在本地连接到由 openshift 设置的 MySQL 数据库,所以我收到了错误。我只是不知道还能在这里尝试什么。我也试过没有密码。

如果我为主机切换到 localhost,这是我收到的错误:

Error: ER_DBACCESS_DENIED_ERROR: Access denied for user ''@'localhost' to database 'stembuds'
at Handshake.Sequence._packetToError (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/sequences/Sequence.js:30:14)
at Handshake.ErrorPacket (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/sequences/Handshake.js:91:18)
at Protocol._parsePacket (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:202:24)
at Parser.write (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Parser.js:62:12)
at Protocol.write (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:37:16)
at Socket.<anonymous> (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/Connection.js:72:28)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:736:14)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
--------------------
at Protocol._enqueue (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:110:26)
at Protocol.handshake (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/protocol/Protocol.js:42:41)
at Connection.connect (/Users/brandonmoffitt/stembudsnode/node_modules/mysql/lib/Connection.js:98:18)
at Object.<anonymous> (/Users/brandonmoffitt/stembudsnode/server.js:16:12)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)

抱歉这篇文章太长了,我只是不知道为什么它不起作用。

编辑:

我通过 ssh 进入 openshift shell 查看 mysql 设置。当我执行“show grants\g”命令时,我收到的是:

  Grants for adminMYXaSuf@127.11.28.130

  GRANT ALL PRIVILEGES ON *.* TO 'adminMYXaSuf'@'127.11.28.130' IDENTIFIED BY PASSWORD '*D0CE5FA2AAD801A33C9190D0B615CC92F364BE6B' WITH GRANT OPTION

此密码与 openshift 提供的密码不同。

【问题讨论】:

  • 你确定连接对象是正确的吗?从查看 npm 包'pass'应该是'password'。还要确保你有正确的端口号,默认为 3306。也许你还应该有一个 'debug: true' 然后向我们展示它的输出。

标签: mysql node.js express openshift


【解决方案1】:

你读过他们的文档吗? 如果您有负载均衡器,您的 mysql 将安装在另一个设备上。 安装墨盒时需要使用 env 变量

port
OPENSHIFT_MYSQL_DB_PORT=44331

host
OPENSHIFT_MYSQL_DB_HOST=12345600a4382ec97a10000f7-somehost.rhcloud.com

OPENSHIFT_MYSQL_DB_PASSWORD=somerandompassword

username
OPENSHIFT_MYSQL_DB_USERNAME=yourusername

在您启动应用时将变量作为 args 传递。

查看节点的示例 https://github.com/openshift-quickstart/nodejs-example/blob/master/server.js

只需使用像 process.env.OPENSHIFT_MYSQL_DB_HOST 这样的环境变量来替换数据库连接中的字符串。

 var mysql = require('mysql');

 var connection = mysql.createConnection({
  host     : process.env.OPENSHIFT_MYSQL_DB_HOST,
  user     : process.env.OPENSHIFT_MYSQL_DB_USERNAME,
  password : process.env.OPENSHIFT_MYSQL_DB_PASSWORD,
  port     : process.env.OPENSHIFT_MYSQL_DB_PORT,
  database : process.env.OPENSHIFT_APP_NAME
 });

【讨论】:

  • 谢谢伙计。这个文档在哪里?此外,过去我在本地环境中使用 openshift 环境变量时遇到了麻烦。我对 JS 有点陌生。您能否详细说明将变量作为参数传递?当您说变量时,您是在谈论 env 变量?
  • 当我使用进程环境变量时,这是我得到的错误 Error: ER_DBACCESS_DENIED_ERROR: Access denied for user ''@'localhost' to database 'stembuds'
  • 你创建了什么数据库?,数据库是你的应用名,没有数据库或数据库名错误无法连接
  • 我还没有在本地创建数据库。我正在尝试通过终端执行此操作,但我无法判断我是否连接到正确的 mysql 服务器
  • 对 openshift 的支持,用于制作比替代方案更难使用的工作流程...
【解决方案2】:

您好像在本地计算机上运行此程序?如果要从本地计算机连接到 OpenShift 上的 mysql 数据库,则需要使用 rhc port-forward 命令,并查看它为 mysql 提供的端口,然后将 ip 设置为 127.0.0.1 和端口到 3307 之类的东西或它在本地为您提供的任何东西。在测试连接时保持 port-forward 命令运行。您也可以尝试将代码推送到 openshift 并使用您拥有的值运行它(或使用您可以通过 env | grep MYSQL 在您的设备上获得的 mysql 环境变量),然后查看它是否有效。

127.x.x.x 不是公开可用的 IP 地址,它们是该服务器专用的,这就是为什么您无法从您的机器连接到它,需要使用 rhc port-forward 命令

这对我有用:

var mysql = require('mysql');

 var connection = mysql.createConnection({
  host     : '127.0.0.1',
  port     : '3306',
  user     : 'admind4DxYD5',
  password : 'some_pass',
  database : 'developercorey'
 });

 connection.connect( function(err){
if (err){ 
    throw err;
}
else {
    console.log('Connected');
}
 });

【讨论】:

  • 老兄,谢谢!是的,它给了我 '127.0.0.1:3307' 用于与 MySQL 的本地连接。我试图连接的对象方式是最好的方式吗?同样在本地,我还需要用户名和密码吗?
  • 错误:连接 ECONNREFUSED 这是我在尝试使用新的 ip 和端口号连接时收到的错误。
  • 您还在使用与上面完全相同的代码吗?不要忘记添加端口:在你的 mysql 配置中有 3307
  • 是的,完全相同的代码,但现在使用端口#。这是我收到的错误错误:连接 ECONNREFUSED
  • 用一个有效的代码示例更新了我的答案。确保更改您的端口和用户/密码,以及数据库名称。 SSH 到您的设备并运行 env | grep MYSQL 并确保您也为 dbname 等使用正确的值。我正在使用节点 运行我的
猜你喜欢
  • 2014-04-24
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2020-11-26
  • 1970-01-01
  • 2013-06-03
  • 2012-10-09
相关资源
最近更新 更多