【问题标题】:Knex migrate latest programmaticallyKnex 以编程方式迁移最新版本
【发布时间】:2017-10-10 16:55:57
【问题描述】:

我正在尝试在启动节点应用程序时跟踪内容。我需要将我的 db 对象导出到其他模块,所以我需要导出 db。

问题是迁移代码可能会出错,但由于 nodejs 的异步特性,db config 已经导出。我希望同步以下代码,以便仅在迁移完成后才会进行导出。

解决此问题的另一种方法可能是从迁移部分抽象出数据库初始化,但如果迁移失败,我希望应用程序关闭。

/*
  1. Db init
  2. Migration stuff
*/
const db = knex(config);
(async () => {
try {
    const migrate = async () => db.migrate.latest();
    await migrate();
} catch(ex) {
    console.log('Error migrating: ', ex);
}
})();

module.exports = db;

【问题讨论】:

    标签: node.js asynchronous synchronization es6-promise knex.js


    【解决方案1】:

    无法延迟模块的导出。

    如果您想在出错时退出,您可以在catch 块中简单地添加process.exit()

    但是,我建议您在主文件中添加一个初始化“守卫”。我所做的是将应用程序启动之前需要完成的所有初始化代码放入一个返回Promise(或接受回调)的函数中,将此函数导入我的主文件中,然后只导入应用程序的其余部分一旦成功。

    例子:

    init.js:

    var db;
    
    function initialize(callback) {
        try {
            db = initializeDatabase();
            callback(null);
        } catch (ex) {
            callback(ex);
        }
    }
    
    exports.initialize = initialize;
    exports.db = db;
    

    main.js:

    const init = require('./init.js');
    
    init.initialize(function (error) {
        if (error) console.log("Initialization failed with error: " + error.toString());
        else {
            const file1 = require('./file1.js');
            const file2 = require('./file2.js');
            // Import the rest of the application...
        }
    });
    

    现在,当您在file1.jsfile2.js 中导入db 时,您可以确定初始化和迁移确实成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多