28

我有一个非常简单的程序,在其中创建 Sequelize 实例,然后对 mysql 数据库执行原始查询。情况是当MySql启动并运行没有问题时,我可以毫无问题地执行查询。但是当 MySql 没有运行时,查询不会发出任何错误,直到达到查询超时,然后它会发出 ETIMEOUT 错误。但事实并非如此。如果 mysql 未运行,我希望查询会发出 ENOTFOUND 错误或类似的错误,因此如果 Mysql 已关闭或 Mysql 非常忙并且响应时间非常长,我可以管理错误并执行不同的操作。我应该怎么做才能检查 Mysql 是否已启动并运行而无需等待超时异常。

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

4 回答 4

50

在最新版本的Sequelize (ie 3.3.2) 中,authenticate可用于检查连接:

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

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

authenticate只需运行SELECT 1+1 AS result查询来检查数据库连接。

更新

最新 API的错误需要处理catch

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

更新 2

我没有对此进行测试,但唯一合乎逻辑的是,可以通过以下方式达到相同的目的async/await

try {
  await sequelize.authenticate()
} catch (err) {
  console.error('Unable to connect to the database:', err)
}
于 2015-06-29T12:37:41.967 回答
7

您不会在.then.

从这里的续集文档:

您可以像这样使用 .authenticate() 函数来测试连接。

sequelize
  .authenticate()
  .then(function(err) {
    console.log('Connection has been established successfully.');
  })
  .catch(function (err) {
    console.log('Unable to connect to the database:', err);
  });
于 2017-04-14T17:43:46.343 回答
0

请检查“wait_timeout”系统变量是否被重置为一些微不足道的值

于 2014-02-13T06:19:19.187 回答
0

我使用以下代码等待数据库引擎启动:

function sleep(ms) {

    return new Promise(function(resolve) {

        setTimeout(resolve, ms);
    });
}

for (;;) {

    try {

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

        await sleep(1000);
    }
}
于 2018-03-14T22:26:48.807 回答