简体   繁体   中英

sequelize: not able to login via localhost?

My question is kind of similar to this one: Cant connect to localhost database with Sequelize (nodejs) , but it has some difference and I couldn't use the answer provided.

I am trying to access mysql server from docker container. The access is provided via mapping mysqld.sock. The basic connection is verified. For example, inside container I can run the command as below.

# mysql --host=localhost --user=root --password=...

However, I cannot run using "127.0.0.1" as host. This might be something to look for regarding what I need to do next.

Then I try to verify mysql access using a nodejs program based on Sequelize as below.

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

When I run it, it reports connection refused.

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

I suspect the problem is Sequelize tries to translate "localhost" which is given in the program to "127.0.0.1", and accessing mysql via 127.0.0.1 does not work inside container.

Thanks for the help.

solved (well, in a way), using dialectOptions

dialectOptions: {
  socketPath: '/var/run/mysqld/mysqld.sock',
  ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM