Knex迁移导致gulp进程挂起

时间:2015-07-17 15:58:05

标签: javascript gulp knex.js

在gulp任务中使用Migrations API中的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);
        });
});

1 个答案:

答案 0 :(得分:7)

看起来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();
        });
});

请注意,如果将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。希望这可以帮助别人。