为什么我的Knex迁移在Heroku上失败,而不是在本地失败?

为什么我的Knex迁移在Heroku上失败,而不是在本地失败?,heroku,knex.js,Heroku,Knex.js,我正在尝试在Heroku上部署我的第一个React应用程序,在我开始迁移之前,一切似乎都很好。我的Knex迁移在本地运行良好,但当我尝试在Heroku上运行它时,迁移失败 由于它在本地机器上运行时工作正常,而且这是我第一次尝试部署任何东西,所以我不确定如何调试它 这是我的迁移代码: exports.up = function(knex, Promise) { return Promise.all([ // USERS TABLE knex.schema.createTable

我正在尝试在Heroku上部署我的第一个React应用程序,在我开始迁移之前,一切似乎都很好。我的Knex迁移在本地运行良好,但当我尝试在Heroku上运行它时,迁移失败

由于它在本地机器上运行时工作正常,而且这是我第一次尝试部署任何东西,所以我不确定如何调试它

这是我的迁移代码:

exports.up = function(knex, Promise) {
  return Promise.all([
    // USERS TABLE
    knex.schema.createTable('users', t => {
      t.uuid('id')
        .primary()
        .unique()
        .notNullable();
      t.string('name').notNullable();
      t.string('email')
        .unique()
        .notNullable();
      t.string('password').notNullable();
      t.timestamp('joined', { useTz: false }).notNullable();
      t.text('website');
      t.string('github');
      t.string('twitter');
      t.text('avatar');
      t.boolean('is_admin')
        .defaultTo(false)
        .notNullable();
    }),

    // INSTRUCTORS TABLE
    knex.schema.createTable('instructors', t => {
      t.uuid('id')
        .primary()
        .unique()
        .notNullable();
      t.string('name')
        .unique()
        .notNullable();
      t.timestamp('created', { useTz: false }).notNullable();
      t.text('website');
      t.string('github');
      t.string('twitter');
      t.text('avatar');
    }),

    // TUTORIALS TABLE
    knex.schema.createTable('tutorials', t => {
      t.string('id')
        .primary()
        .unique()
        .notNullable();
      t.uuid('user_id').notNullable();
      t.uuid('instructor_id');
      t.string('instructor_name');
      t.string('title').notNullable();
      t.text('url')
        .unique()
        .notNullable();
      t.timestamp('date', { useTz: false }).notNullable();
      t.enum('cost', ['free', 'paid']).notNullable();
      t.enum('medium', ['article', 'video']).notNullable();
      t.enum('difficulty', ['beginner', 'advanced']).notNullable();
      t.specificType('categories', 'text ARRAY').notNullable();
    }),

    // COMMENTS TABLE
    knex.schema.createTable('comments', t => {
      t.string('id')
        .primary()
        .unique()
        .notNullable();
      t.uuid('user_id').notNullable();
      t.string('tutorial_id').notNullable();
      t.text('body').notNullable();
      t.timestamp('date', { useTz: false }).notNullable();
    }),

    knex.schema.createTable('tutorial_votes', t => {
      t.uuid('id')
        .primary()
        .unique()
        .notNullable();
      t.string('tutorial_id').notNullable();
      t.uuid('user_id').notNullable();
      t.smallint('vote_value');
    }),
    knex.schema.createTable('comment_votes', t => {
      t.uuid('id')
        .primary()
        .unique()
        .notNullable();
      t.string('comment_id').notNullable();
      t.uuid('user_id').notNullable();
      t.smallint('vote_value');
    }),
    knex.schema.createTable('favorites', t => {
      t.uuid('id')
        .primary()
        .unique()
        .notNullable();
      t.string('tutorial_id').notNullable();
      t.uuid('user_id').notNullable();
      t.timestamp('date', { useTz: false }).notNullable();
    })
  ]);

  console.log('Tables created successfully');
};

exports.down = function(knex, Promise) {
  return Promise.all([
    knex.schema.dropTable('users'),
    knex.schema.dropTable('instructors'),
    knex.schema.dropTable('tutorials'),
    knex.schema.dropTable('comments'),
    knex.schema.dropTable('tutorial_votes'),
    knex.schema.dropTable('comment_votes'),
    knex.schema.dropTable('favorites')
  ]);

  console.log('Tables dropped');
};
下面是我得到的错误:

remote:        migration file "20190731184441_setup.js" failed
remote:        migration failed with error: Cannot read property 'all' of undefined
remote: TypeError: Cannot read property 'all' of undefined
remote:     at Object.exports.up (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/db/migrations/20190731184441_setup.js:2:18)
remote:     at Object.<anonymous> (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/lib/migrate/Migrator.js:503:40)
remote:     at Object.tryCatcher (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/util.js:16:23)
remote:     at Promise._settlePromiseFromHandler (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/promise.js:547:31)
remote:     at Promise._settlePromise (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/promise.js:604:18)
remote:     at Promise._settlePromiseCtx (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/promise.js:641:10)
remote:     at _drainQueueStep (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/async.js:97:12)
remote:     at _drainQueue (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/async.js:86:9)
remote:     at Async._drainQueues (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/async.js:102:5)
remote:     at Immediate.Async.drainQueues [as _onImmediate] (/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/async.js:15:14)
remote:     at processImmediate (internal/timers.js:439:21)
remote:迁移文件“20190731184441_setup.js”失败
远程:迁移失败,错误为:无法读取未定义的属性“all”
远程:TypeError:无法读取未定义的属性“all”
远程:在Object.exports.up(/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/db/migrations/20190731184441_setup.js:2:18)
远程:在对象上。(/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/lib/migrate/Migrator.js:503:40)
远程:位于Object.tryCatcher(/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/util.js:16:23)
远程:按承诺。_settlePromiseFromHandler(/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/Promise.js:547:31)
远程:按承诺。_结算简化(/tmp/build7917ECDEF592CA80A65BFDEE9B4E67C6/server/node_modules/knex/node_modules/bluebird/js/release/Promise.js:604:18)
远程:按承诺。_settlepromistex(/tmp/build7917ecdef592ca80a65bdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/Promise.js:641:10)
远程:位于drainQueueStep(/tmp/build7917ECDEF592CA80A65BFDEE9B4E67C6/server/node_modules/knex/node_modules/bluebird/js/release/async.js:97:12)
远程:位于drainQueue(/tmp/build\u7917ecdef592ca80a65bdee9b4e67c6/server/node\u modules/knex/node\u modules/bluebird/js/release/async.js:86:9)
远程:异步绘制队列(/tmp/build7917ECDEF592CA80A65BFDEE9B4E67C6/server/node_modules/knex/node_modules/bluebird/js/release/Async.js:102:5)
远程:在Immediate.Async.drainQueues[as_onImmediate](/tmp/build_7917ecdef592ca80a65bfdee9b4e67c6/server/node_modules/knex/node_modules/bluebird/js/release/Async.js:15:14)
远程:在processImmediate(internal/timers.js:439:21)

通过从
exports.up=function(knex,Promise)
&
exports.down=function(knex,Promise)
中删除
Promise
进行修复。我认为这可能是本地版本与Heroku安装的版本不匹配。如果您的semver规范非常宽松,那将允许Heroku安装一个更新的版本,并且可能您已经针对本地版本开发了一段时间


我怀疑的原因是:0.18.0版中的Knex,这意味着迁移不再通过Bluebird
Promise
传递。该参数不再存在,因此您会出错。

我猜在heroku中,迁移函数的
Promise
param没有提供,因此
Promise.all
抛出您看到的异常。不确定解决方案是什么,建议将其作为面向调试的观察。希望有帮助!