一个迁移文件中的多个迁移语句

问题描述 投票:8回答:2

我试图在单个迁移文件中执行多个迁移语句,以便一次更改同一个表的多个列。

我想知道我是否以写入方式进行,或者是否有更好,更合适的方法:

Migration Code

module.exports = {
    up: function(queryInterface, Sequelize, done) {

        queryInterface.changeColumn('users', 'name', {
            type: Sequelize.STRING,
            allowNull: false,
            require: true,
            unique: true
        }).success(function() {
            queryInterface.changeColumn('users', 'address', {
                type: Sequelize.STRING,
                allowNull: false,
                require: true,
                unique: true
            }).success(function() {
                queryInterface.changeColumn('users', 'city', {
                    type: Sequelize.STRING,
                    allowNull: false,
                    require: true,
                    unique: true
                }).success(function() {
                    queryInterface.changeColumn('users', 'state', {
                        type: Sequelize.STRING,
                        allowNull: false,
                        require: true,
                        defaultValue: "ncjnbcb"
                    });
                    done();
                });
            });
        });
    }
};

但是我面临一个错误:

TypeError:undefined不是函数

由于我在迁移中找不到任何调试错误的方法,如果有人帮助我解决它或者如果可能的话,告诉我们如何找出迁移中的错误的方式将会很棒。

node.js error-handling migration sails.js sequelize.js
2个回答
13
投票

你的TypeError可能是因为你没有返回任何东西。 docs说每个迁移函数都应该返回一个Promise。没有提到done回调。

为此,请尝试以下方法:

return Promise.all([
  queryInterface.changeColumn..., 
  queryInterface.changeColumn...
]);

1
投票
module.exports = {
  up: async (queryInterface, Sequelize) => {
    try {
      await queryInterface.addColumn('User', 'name', {
        type: Sequelize.STRING
      });
      await queryInterface.addColumn('User', 'nickname', {
        type: Sequelize.STRING
      });
      return Promise.resolve();
    } catch (e) {
      return Promise.reject(e);
    }
  },

  down: async (queryInterface, Sequelize) => {
    try {
      await queryInterface.removeColumn('Challenges', 'name');
      await queryInterface.removeColumn('Challenges', 'nickname');
      return Promise.resolve();
    } catch (e) {
      return Promise.reject(e);
    }
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.