【问题标题】:How to execute some database commands in koa before or after app.listen()如何在 app.listen() 之前或之后在 koa 中执行一些数据库命令
【发布时间】:2016-03-12 02:02:24
【问题描述】:

期望的结果

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

server.js 中的优化流程

  1. 设置 MySQL 连接
  2. 检查并更新数据库
    • 如果更新脚本出现问题或更新过程中出现意外错误,则会导致崩溃和烧毁。
  3. 添加路线
  4. 启动服务器

我认为数据库的更新可以在 #1 之后的任何时候完成,但我还没有太成功。

我的工作主要基于来自 https://github.com/chrisveness/koa-sample-web-app-api-mysql 的示例代码,尽管它只关注 api 更简单。

代码 sn-ps

// 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 - 我读过这个并尝试过,但它似乎没有做任何事情。

【问题讨论】:

    标签: mysql koa


    【解决方案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,但对此无话可说。

    【讨论】:

      【解决方案2】:

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

      Javascript strange generator yield sub function behavior

      【讨论】:

        猜你喜欢
        • 2017-03-28
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        相关资源
        最近更新 更多