为什么节点脚本无法通过localhost连接到MySQL

时间:2017-07-28 22:10:01

标签: mysql node.js

我无法弄清楚为什么脚本无法连接到MySQL实例。

我可以在命令行上使用完全相同的凭据从mysql客户端连接到数据库。 我可以使用相同的凭据从远程客户端连接到数据库。

如果我将参数设置为远程数据库,则数据库连接脚本可以正常工作。

主机或套接字参数都不能通过脚本运行。 我有时会犯愚蠢的错误但如果这是另一个错误,我看不到它。

外面的观察者会帮助我。

====================数据库连接代码

var db = require('./config');
var mysql = require('mysql');

var connection = mysql.createConnection({
    host: db.db_parms.host,
    port: db.db_parms.port,
    user: db.db_parms.user,
    password: db.db_parms.password,
    database: db.db_parms.context,
    debug:true
});

connection.connect(function(err) {
    if(err){
        console.log("SQL CONNECT ERROR: " + err);
    } else {
        console.log("SQL CONNECT SUCCESSFUL.");
    }
});

connection.query("SELECT now()", function(error,results,fields) {
    console.log("Results:" + results);
    console.log("Fields:" + fields);
});


exports.connection = connection;

===错误堆栈返回:

SQL CONNECT ERROR: Error: connect ECONNREFUSED 127.0.0.1:3307
    at Object.exports._errnoException (util.js:1036:11)
    at exports._exceptionWithHostPort (util.js:1059:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14)
    --------------------
    at Protocol._enqueue (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/protocol/Protocol.js:141:48)
    at Protocol.handshake (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/protocol/Protocol.js:52:41)
    at Connection.connect (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/Connection.js:130:18)
    at Object.<anonymous> (/home/kingram/node/apps/fss_register/db/db_connect.js:19:12)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)

========= config.js with host ='localhost':

var db_parms = {
host: 'localhost',
port: 3307,
user:'foo',
password:'bar',
database:'thisone'
}

exports.db_parms = db_parms;

========= config.js with host = socket:

host: '/var/run/mysqld/mysqld.sock',

===错误堆栈返回:

SQL CONNECT ERROR: Error: getaddrinfo ENOTFOUND /var/run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock:3307
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
    --------------------
    at Protocol._enqueue (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/protocol/Protocol.js:141:48)
    at Protocol.handshake (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/protocol/Protocol.js:52:41)
    at Connection.connect (/home/kingram/node/apps/fss_register/node_modules/mysql/lib/Connection.js:130:18)
    at Object.<anonymous> (/home/kingram/node/apps/fss_register/db/db_connect.js:19:12)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)

我不确定套接字中的错误是否是权限问题,以及是否相关。

2 个答案:

答案 0 :(得分:0)

事实证明,检查my.conf会显示绑定地址设置为服务器的IP而不是localhost。

设置host: '<ip-address>'解决了问题。

答案 1 :(得分:-1)

在配置文件中验证您使用的端口是3306而不是3307.默认情况下,MySQL服务使用端口号3306.