我的问题有点类似于这个:Cant connect to localhost database with Sequelize (nodejs) ,但它有一些区别,我无法使用提供的答案。
我正在尝试从 docker 容器访问 mysql 服务器。通过映射 mysqld.sock 提供访问。基本连接已验证。例如,在容器内我可以运行如下命令。
# mysql --host=localhost --user=root --password=...
但是,我无法使用“127.0.0.1”作为主机运行。这可能是我下一步需要做的事情。
然后我尝试使用基于 Sequelize 的 Nodejs 程序来验证 mysql 访问,如下所示。
var Sequelize = require('sequelize')
var sequelize = new Sequelize('mysql', 'root', '...', {
host: 'localhost',
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000
},
});
sequelize
.authenticate()
.then(function(err) {
console.log('Connection has been established successfully.');
})
.catch(function (err) {
console.log('Unable to connect to the database:', err);
});
当我运行它时,它报告连接被拒绝。
Unable to connect to the database: { SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
at Handshake._callback (/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:80:20)
at Handshake.Sequence.end (/node_modules/mysql/lib/protocol/sequences/Sequence.js:86:24)
at Protocol.handleNetworkError (/node_modules/mysql/lib/protocol/Protocol.js:364:14)
at Connection._handleNetworkError (/node_modules/mysql/lib/Connection.js:428:18)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at emitErrorNT (net.js:1278:8)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
name: 'SequelizeConnectionRefusedError',
message: 'connect ECONNREFUSED 127.0.0.1:3306',
parent:
{ Error: connect ECONNREFUSED 127.0.0.1:3306
at Object.exports._errnoException (util.js:1022:11)
at exports._exceptionWithHostPort (util.js:1045:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1087:14)
--------------------
at Protocol._enqueue (/node_modules/mysql/lib/protocol/Protocol.js:141:48)
at Protocol.handshake (/node_modules/mysql/lib/protocol/Protocol.js:52:41)
at Connection.connect (/node_modules/mysql/lib/Connection.js:130:18)
at /node_modules/sequelize/lib/dialects/mysql/connection-manager.js:75:16
at Promise._execute (/node_modules/bluebird/js/release/debuggability.js:300:9)
at Promise._resolveFromExecutor (/node_modules/bluebird/js/release/promise.js:481:18)
at new Promise (/node_modules/bluebird/js/release/promise.js:77:14)
at ConnectionManager.connect (/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:55:10)
at ConnectionManager.<anonymous> (/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:247:43)
at ConnectionManager.tryCatcher (/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/node_modules/bluebird/js/release/async.js:143:10)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 3306,
fatal: true },
original:
{ Error: connect ECONNREFUSED 127.0.0.1:3306
at Object.exports._errnoException (util.js:1022:11)
at exports._exceptionWithHostPort (util.js:1045:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1087:14)
--------------------
at Protocol._enqueue (/node_modules/mysql/lib/protocol/Protocol.js:141:48)
at Protocol.handshake (/node_modules/mysql/lib/protocol/Protocol.js:52:41)
at Connection.connect (/node_modules/mysql/lib/Connection.js:130:18)
at /node_modules/sequelize/lib/dialects/mysql/connection-manager.js:75:16
at Promise._execute (/node_modules/bluebird/js/release/debuggability.js:300:9)
at Promise._resolveFromExecutor (/node_modules/bluebird/js/release/promise.js:481:18)
at new Promise (/node_modules/bluebird/js/release/promise.js:77:14)
at ConnectionManager.connect (/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:55:10)
at ConnectionManager.<anonymous> (/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:247:43)
at ConnectionManager.tryCatcher (/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/node_modules/bluebird/js/release/async.js:143:10)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 3306,
fatal: true } }
我怀疑问题是Sequelize尝试将程序中给出的“localhost”翻译为“127.0.0.1”,并且通过127.0.0.1访问mysql在容器内不起作用。
感谢您的帮助。
最佳答案
使用 dialectOptions 解决了(嗯,在某种程度上)
dialectOptions: {
socketPath: '/var/run/mysqld/mysqld.sock',
...
}
关于mysql - Sequelize : not able to login via localhost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41882300/