我想在我的节点+ koa + mysql服务器启动时或周围检查数据库的状态,并在需要时应用更新脚本。
我认为数据库的更新可以在#1之后的任何时候完成,但我还没有成功。
我的工作主要基于https://github.com/chrisveness/koa-sample-web-app-api-mysql的示例代码,尽管只关注api更简单。
// schema/fate2.js
const versionModel = require('../models/version');
module.exports = function* updateToHead() {
yield versionModel.init();
try {
yield syncTrunkAndDev();
} catch (e) {
console.log("Latest trunk schema version is: " + versionModel.getTrunkLast());
console.log("Latest dev schema version is: " + versionModel.getDevLast());
throw "Error in upgrading", e;
}
}
// server.js
app.use(require('./schema/fate2'));
...
app.listen(process.env.PORT||3030);
// models/version.js
const Version = module.exports = {};
Version.init = function*() {
yield GLOBAL.db.query(
"CREATE TABLE IF NOT EXISTS version ( " +
" id int(11) NOT NULL," +
" dev int(1) NOT NULL," +
" description varchar(50) NOT NULL," +
" applied_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
" dirty int(1) NOT NULL DEFAULT '1'," +
" PRIMARY KEY (id)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8"
);
};
How to perform initial setup in koa with rethinkdb - 我读了这篇文章并尝试过但它似乎没有做任何事情。
答案 0 :(得分:1)
最简单的解决方案可能是将app.listen
包装在co
进程中,以便在引导服务器之前依次生成启动过程。
如果其中任何一个抛出,则执行将跳过app.listen
,您可以轻松地在一个地方捕获所有异常:
const co = require('co');
co(function*() {
yield require('./schema/fate2');
yield require('./models/version').init();
app.listen(3000, function() { console.log('listening on 3000') });
}).catch(function(err) {
console.error('Server boot failed:', err, err.stack);
});
我之前在Github上偶然发现了https://github.com/node-modules/ready-callback,但没有什么可说的。
答案 1 :(得分:0)
解决问题的过程是正确的,但经过大量挖掘后,问题的根源是由于错误调用生成器函数引起的。