无法使用nodejs连接到MySQL数据库(openshift app)

时间:2014-03-03 17:15:18

标签: mysql node.js express openshift

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

 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'ed进入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

此密码与提供的openhift不同。

2 个答案:

答案 0 :(得分:8)

你读过他们的博士吗? 如果你有负载均衡器,你的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这样的env变量来替换数据库连接中的字符串。

 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
 });

答案 1 :(得分: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');
}
 });