首页 > 解决方案 > 将 Async/Await 与 Knex 迁移一起使用

问题描述

我正在使用带有常规 promise 方法的 Knex 迁移,如下所示:

exports.up = function (knex) {
    return knex.schema
        .hasTable('table_name')
        .then(function (exists) {
            if (!exists) {
                return knex
                    .schema
                    .createTable('table_name', function (table) {
                        table.increments('id').primary();
                    })
                    .then(console.log('created table_nametable'));
            }
        });
};

我将如何重构它以使用 async/await?整体结构,我们返回 knex.schema 并带有一系列 promise 方法,这让我陷入了循环。

标签: async-awaitknex.js

解决方案


这样的事情应该做:

exports.up = async function (knex) {  
    if (! (await knex.schema.hasTable('table_name')) ) {
      await knex.schema.createTable('table_name', function (table) {
        table.increments('id').primary();
      });
    }

    // awaiting sequentially multiple promises to resolve one by one
    for (let item of arrayOfStuffToAwait) {
      await item;
    }
}

exports.down = async function (knex) {  
  await knex.schema.dropTable('table_name');
}

推荐阅读