Knex以编程方式迁移最新版本

时间:2017-05-11 15:23:14

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

我正在尝试在启动节点应用程序时关注内容。我需要将我的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;

1 个答案:

答案 0 :(得分:0)

无法延迟模块的导出。

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

但是,我建议你在主文件中添加一个初始化“guard”。我所做的是在应用程序启动之前将所有需要完成的初始化代码放在一个返回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...
    }
});

现在,当您在dbfile1.js中导入file2.js时,您可以确保初始化和迁移确实成功。