Knex 迁移导致 gulp 进程挂起
Knex Migrations cause gulp process to hang
在 gulp 任务中使用 Migrations API in knex.js 会导致任务进程挂起而不退出。是什么原因造成的,我该如何解决?
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 的连接池和显式销毁命令的文档是 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();
});
});
请注意,如果您在 gulp 文件中将 knex 配置为变量,那么即使该任务不使用您的 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。希望这可以帮助某人。
在 gulp 任务中使用 Migrations API in knex.js 会导致任务进程挂起而不退出。是什么原因造成的,我该如何解决?
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 的连接池和显式销毁命令的文档是 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();
});
});
请注意,如果您在 gulp 文件中将 knex 配置为变量,那么即使该任务不使用您的 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。希望这可以帮助某人。