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。希望这可以帮助某人。