Check mysql connection in sequelize

不想你离开。 提交于 2019-12-22 01:25:44

问题


I have a very simple program in where I create a Sequelize instance and then I perform a raw query on a mysql database. The case is that when MySql is up and running there is no problem, I can perform the query with no problems. But when MySql is not running then the query doesn't emmit any error until the query timeout has reached and then it emmits a ETIMEOUT error. But that's not really what's happening. I expect the query to emit ENOTFOUND error or something like that if mysql is not running so I can manage the error and perform different actions if Mysql has gone down or Mysql is very busy and has a very large response time. What shoul'd I do to check if Mysql is up and running without having to wait the timeout exception.

sequelize = new Sequelize(db_name, db_user, db_pass, opts);

sequelize.query('SELECT * FROM some_table').success(function(result) {
  console.log(result);
}).error(function(err) {
  console.log(err);
});

回答1:


As of latest version of Sequelize (i.e. 3.3.2), authenticate can be used to check the connection:

var sequelize = new Sequelize("db", "user", "pass");

sequelize.authenticate().then(function(errors) { console.log(errors) });

authenticate simply runs SELECT 1+1 AS result query to check the db connection.

UPDATE:

Errors by the newest API need to be handled in catch:

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });



回答2:


You won't see errors, like password authentication errors, in .then.

From the sequelize documentation here:

You can use the .authenticate() function like this to test the connection.

sequelize
  .authenticate()
  .then(function(err) {
    console.log('Connection has been established successfully.');
  })
  .catch(function (err) {
    console.log('Unable to connect to the database:', err);
  });



回答3:


Please check "wait_timeout" system variable if its been reset to some trivial value




回答4:


I use the following code to wait for the db engine to start:

function sleep(ms) {

    return new Promise(function(resolve) {

        setTimeout(resolve, ms);
    });
}

for (;;) {

    try {

        await db.authenticate();
        break;
    } catch(ex) {

        await sleep(1000);
    }
}


来源:https://stackoverflow.com/questions/19429152/check-mysql-connection-in-sequelize

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!