Knex 以编程方式迁移最新版本
Posted
技术标签:
【中文标题】Knex 以编程方式迁移最新版本【英文标题】:Knex migrate latest programmatically 【发布时间】: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;
【问题讨论】:
【参考方案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.js
和file2.js
中导入db
时,您可以确定初始化和迁移确实成功了。
【讨论】:
以上是关于Knex 以编程方式迁移最新版本的主要内容,如果未能解决你的问题,请参考以下文章