Knex迁移导致gulp进程挂起

3
在gulp任务中使用knex.js迁移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);
        });
});
1个回答

7
似乎Knex在完成迁移后会保留对打开的数据库连接的引用,但它不会自动销毁该引用,这会导致进程挂起。为了解决这个问题,请在迁移完成后调用knex.destroy。这将允许gulp进程正常退出。
关于Knex连接池和显式销毁命令的文档可以在这里找到。
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();
        });
});

顺便提一下,如果你在gulpfile中将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。希望这能对某些人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接