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);
});
Sequelize (つまり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
クエリを実行して、db接続を確認します。
[〜#〜]更新[〜#〜]:
最新のAPI によるエラーはcatch
で処理する必要があります:
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
.then
には、パスワード認証エラーなどのエラーは表示されません。
続編のドキュメントから here :
このような.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);
});
次のコードを使用して、dbエンジンの起動を待機します。
function sleep(ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
for (;;) {
try {
await db.authenticate();
break;
} catch(ex) {
await sleep(1000);
}
}
「wait_timeout」システム変数を確認して、それが何らかの重要な値にリセットされているかどうかを確認してください