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

Node.js Knex以编程方式迁移最新版本,node.js,asynchronous,synchronization,es6-promise,knex.js,Node.js,Asynchronous,Synchronization,Es6 Promise,Knex.js,我尝试在启动节点应用程序时跟踪这些内容。我需要将我的db对象导出到其他模块,所以我需要导出db 问题是迁移代码可能会给出错误,但由于nodejs的异步性质,db config已经被导出。我希望同步以下代码,以便只有在迁移完成时才能进行导出 另一种方法可能是从迁移部分抽象出db初始化,但如果迁移失败,我希望应用程序关闭 /* 1. Db init 2. Migration stuff */ const db = knex(config); (async () => { try {

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

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

另一种方法可能是从迁移部分抽象出db初始化,但如果迁移失败,我希望应用程序关闭

/*
  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;

无法延迟模块的导出

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

但是,我建议您在主文件中添加一个初始化“guard”。我要做的是将应用程序启动前需要完成的所有初始化代码放在一个函数中,该函数返回一个
承诺
(或进行回调),将此函数导入到我的主文件中,并仅在成功后导入应用程序的其余部分

例如:

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.js
file2.js
中导入
db
时,可以确保初始化和迁移成功