mysql - Sequelize : not able to login via localhost?

标签 mysql node.js sequelize.js

我的问题有点类似于这个: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/

相关文章:

mysql - SQL 仅选择列上具有最大值的行

mysql - 使用 Google Chrome 扩展连接 MySQL 数据库?

java - 如何将 2 个 json 合并为一个来解析 JSON

node.js - 如何在 node.js 程序中查看整个请求和响应对象?

mysql - 带层的数据库产品表

php - 修改我的数据库中的表

mysql - nodejs 和 mysql 连接失败?

javascript - Mongoose 文档的条件 TTL

postgresql - 如何在 sequelize 中使用 findAll() 方法从 postgresql 获取表数据?

sequelize.js - 工厂女孩设置了 Sequelize 适配器