在gulp任务中使用knex.js中的Migrations API会导致任务进程挂起而不会退出.是什么导致这种情况,我该如何解决?
gulp.task('migrate:latest', function () {
return knex.migrate.latest({
migrations: {
tableName: 'migrations'
}
})
.then(function () {
return knex.migrate.currentVersion();
})
.then(function (version) {
console.log("Kicked database to version: " + version);
})
.catch(function (err) {
console.error(err);
});
});
解决方法:
看起来Knex保留了对开放数据库连接的引用,它在迁移完成后不会自动销毁 – 这会导致进程挂起.要解决此问题,请在迁移解析后调用knex.destroy.这将允许gulp进程正常退出.
有关knex的连接池和显式destroy命令的文档是here.
gulp任务变为:
gulp.task('migrate:latest', function () {
return knex.migrate.latest({
migrations: {
tableName: 'migrations'
}
})
.then(function () {
return knex.migrate.currentVersion();
})
.then(function (version) {
console.log("Kicked database to version: " + version);
knex.destroy();
})
.catch(function (err) {
console.error(err);
knex.destroy();
});
});
请注意,如果将knex配置为gulpfile中的变量,即使该任务不使用您的knex实例,也会对所有任务执行此操作.解决方法是将knex配置定义为函数,然后在需要时调用它,如下所示:
var knex = function () {
return require('knex')({
client: 'postgresql',
connection: {
host: process.env.DB_HOSTNAME,
user: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
charset: 'utf8'
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'migrations'
}
});
};
gulp.task('migrate:latest', function () {
return knex().migrate.latest({ // Call the function to set up your config.
migrations: {
tableName: 'migrations'
}
})
...
这使您无需在不需要它的任务中调用knex.destroy.希望这可以帮助别人.