当前位置: 首页 > 知识库问答 >
问题:

使用顺序迁移时,不会创建顺序特殊方法

杜正奇
2023-03-14

当使用顺序迁移以及用户和角色之间的多对多关系时,我很纠结。

这是用户模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('Users', {
    username: DataTypes.STRING,
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {});
  user.associate = function(models) {
    // associations can be defined here
    user.belongsToMany(models.Roles, {
      through: models.UserRoles
    });
  };
  return user;
};

这是角色模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const role = sequelize.define('Roles', {
    name: DataTypes.STRING
  }, {});
  role.associate = function(models) {
    // associations can be defined here
    role.belongsToMany(models.Users, {
      through: models.UserRoles
    });
  };
  return role;
};

这是“创建用户”迁移:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      username: {
        type: Sequelize.STRING,
        allowNull: true,
        len: [0, 20]
        },
        name: {
          type: Sequelize.STRING,
          allowNull: true,
        },
        email: {
          type: Sequelize.STRING,
          allowNull: false
        },
        password: {
          type: Sequelize.STRING,
          allowNull: false
        },
        createdAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
        }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

这是“创建角色”迁移:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Roles', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Roles');
  }
};

这是用户角色模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const user_role = sequelize.define('UserRoles', {
    userId: DataTypes.INTEGER,
    roleId: DataTypes.INTEGER
  }, {});
  user_role.associate = function(models) {
    // associations can be defined here

  };
  return user_role;
};

最后一个是“用户角色”迁移:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('UserRoles', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      userId: {
        primaryKey: true,
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {        
          model: 'Users',
          key: 'id'
        }
      },
      roleId: {
        primaryKey: true,
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {         
          model: 'Roles',
          key: 'id'
        }      
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('UserRoles');
  }
};

当我尝试从控制器访问user.setRoles()时,就会出现问题:

exports.signup = (req, res) => {
  console.log('creating new user', req.body.username);
  // Save User to Database
  User.create({
    username: req.body.username,
    email: req.body.email,
    password: bcrypt.hashSync(req.body.password, 8)
  })
    .then(user => {

      console.log('USER ADDED');
      if (req.body.roles) {
        Role.findAll({
          where: {
            name: {
              [Op.or]: req.body.roles
            }
          }
        }).then(roles => {
          console.log('ROLES ', roles);
          user.setRoles(roles).then(() => {
            res.send({ message: "User was registered successfully!" });
          });
        });
      } else {
        console.log('NO ROLES > Normal User');
        // user role = 1
        user.setRoles([1]).then(() => {
          res.send({ message: "User was registered successfully!" });
        });
      }
    })
    .catch(err => {
      console.log('ERROR: ', err);
      res.status(500).send({ message: err.message });
    });
};

当我使用< code > console . log(object . keys(user。_ _ proto _ _)我得到了这个没有创建特殊方法的数组,知道我哪里做错了吗?

Array(7) ["_customGetters", "_customSetters", "validators", "_hasCustomGetters", "_hasCustomSetters", "rawAttributes", "_isAttribute"]

非常感谢您的帮助!

共有1个答案

韦睿
2023-03-14

注册模型后只需调用所有关联函数。例如:

const models = path.join(__dirname, 'models')
const db = {}

fs.readdirSync(models)
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file.slice(-3) === '.js')
  })
  .forEach(function (file) {
    var model = sequelize['import'](path.join(models, file))
    db[model.name] = model
  })

Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

 类似资料:
  • Nodejs。顺序4.41。尝试通过另一个表制作两个多对多关系的模型。例如,使用sequelize-cli运行... 这里有模特 和 留档里有短语 属于多个关联用于连接具有多个目标的源。此外,目标也可以连接到多个源。 这将创建一个名为UserProject的新模型,该模型具有等效的外键Project ectId和userId。 迁移是 和 为什么在我运行迁移时,它不创建模型CameraRelay,

  • 有没有办法在刷新Spring上下文后找出bean创建顺序(或至少依赖顺序)? 只要简单的bean定义顺序就可以了。我不想要他们注册的顺序。我想要创建它们的顺序(依赖关系树)

  • 问题内容: 有没有一种方法可以验证在Mockito中是否曾经调用过a? 问题答案: 帮助您做到这一点。

  • 问题内容: 我有一个使用字符串作为键和值的映射。我有一个键数组,用于指定地图值的顺序。 我想将该映射序列化为JSON,但要保持数组上定义的顺序。 这里有一个示例代码:http : //play.golang.org/p/A52GTDY6Wx 我想将其序列化为: 但是,如果我直接序列化地图,则密钥按字母顺序排列: 我可以将其序列化为地图数组,从而保持顺序,但是会生成很多不需要的字符: 在我的真实代码

  • 我有一个代理“Tankfarm”,它是一个有一定规则的罐的集合,这些罐的装满顺序或产品的使用等。这些罐的数量(可见或不可见)和初始内容--它们包含的流体类型和此类流体的数量,等等,都是在模型启动时从Excel表格中读取的。“产品”本身是由一个代理定义的,该代理在启动时从另一个Excel表中读取产品列表,每个产品都有其属性。 因此,在一次模拟运行中,产品可能是不同等级的汽油。在下一次运行中,可能是化