如何在app.listen()之前或之后在koa中执行一些数据库命令

时间:2015-12-07 12:54:10

标签: mysql koa

期望的结果

我想在我的节点+ koa + mysql服务器启动时或周围检查数据库的状态,并在需要时应用更新脚本。

server.js

中的最佳流程
  1. 设置MySQL连接
  2. 检查并更新数据库
    • 如果更新脚本出现问题或更新过程中出现意外错误,则会崩溃并刻录。
  3. 添加路线
  4. 启动服务器
  5. 我认为数据库的更新可以在#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"
      );
    };
    

    其他stackoverflow帖子

    How to perform initial setup in koa with rethinkdb - 我读了这篇文章并尝试过但它似乎没有做任何事情。

2 个答案:

答案 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)

解决问题的过程是正确的,但经过大量挖掘后,问题的根源是由于错误调用生成器函数引起的。

请参阅Javascript strange generator yield sub function behavior