javascript – Knex迁移导致gulp进程挂起

在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.希望这可以帮助别人.

上一篇:javascript – 在进程启动时使用回调在Gulp中启动shell进程


下一篇:javascript – Gulp和FTP:如何只传输文件夹的内容?