Sequelize模型原型显示添加功能,但执行时失败

时间:2017-12-24 23:50:21

标签: mysql database sequelize.js models has-and-belongs-to-many

使用sequelize将用户添加到我的主板模型时遇到问题。我的关联定义如下:

module.exports = function(sequelize, DataTypes) {
    var Board = sequelize.define("Board", {
        name: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: [1]
            }
        },
        favorited: {
            type: DataTypes.BOOLEAN,
            allowNull: false,
            defaultValue: false
        }
    });
    Board.associate = function(models) {
        Board.belongsTo(models.User, {
            foreignKey: {
                name: "OwnerId"
            }
        });
        Board.belongsToMany(models.User, {
            through: "UserBoards"
        });
    };
    return Board;
};

我的用户模型:

module.exports = function(sequelize, DataTypes) {
    var User = sequelize.define("User", {
        name: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                isAlphanumeric: true
            }
        },
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                isEmail: true
            }
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false
        }
    });

    User.associate = function(models) {
        User.belongsToMany(models.Board, {
            through: "UserBoards"
        });
    };

    return User;

};

控制台记录Boards.prototype给出了以下内容:

Board {
  _customGetters: {},
  _customSetters: {},
  validators: { name: { len: [Object] } },
  _hasCustomGetters: 0,
  _hasCustomSetters: 0,
  rawAttributes:
   { id:
      { type: [Object],
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
        _autoGenerated: true,
        Model: Board,
        fieldName: 'id',
        _modelAttribute: true,
        field: 'id' },
     name:
      { type: [Object],
        allowNull: false,
        validate: [Object],
        Model: Board,
        fieldName: 'name',
        _modelAttribute: true,
        field: 'name' },
     favorited:
      { type: BOOLEAN {},
        allowNull: false,
        defaultValue: false,
        Model: Board,
        fieldName: 'favorited',
        _modelAttribute: true,
        field: 'favorited' },
     createdAt:
      { type: [Object],
        allowNull: false,
        _autoGenerated: true,
        Model: Board,
        fieldName: 'createdAt',
        _modelAttribute: true,
        field: 'createdAt' },
     updatedAt:
      { type: [Object],
        allowNull: false,
        _autoGenerated: true,
        Model: Board,
        fieldName: 'updatedAt',
        _modelAttribute: true,
        field: 'updatedAt' },
     OwnerId:
      { name: 'OwnerId',
        type: [Object],
        allowNull: true,
        references: [Object],
        onDelete: 'SET NULL',
        onUpdate: 'CASCADE',
        Model: Board,
        fieldName: 'OwnerId',
        _modelAttribute: true,
        field: 'OwnerId' } },
  attributes: [ 'id', 'name', 'favorited', 'createdAt', 'updatedAt', 'OwnerId' ],
  _isAttribute: { [Function: memoized] cache: MapCache { size: 0, __data__: [Object] } },
  getUser: [Function],
  setUser: [Function],
  createUser: [Function],
  getUsers: [Function],
  countUsers: [Function],
  hasUser: [Function],
  hasUsers: [Function],
  setUsers: [Function],
  addUser: [Function],
  addUsers: [Function],
  removeUser: [Function],
  removeUsers: [Function] }

但是当我试图让他跟踪我的路线时,它说addUser / addUsers不是函数:

router.get("/boards/:id/users/:uid", function(req, res) {
    var query = {};
    if (req.params.id) {
        query.id = req.params.id;
        db.Board.findAll({
            where: query
        }).then(function(dbBoard) {
            dbBoard.addUser(req.params.uid);
            res.json(dbBoards);
        });
    }

});

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

添加关联特定于实例。您必须在Board模型的单个实例上调用此方法。例如:

const singleBoard = db.board.findOne({where: query};
const user = db.users.findOne({where: {id: parseInt(req.params.uid)});
singleBoard.addUser(user);

如果必须在多个板上进行相同的操作,则可以遍历通过findAll查询获得的数组。

https://sequelize.org/master/manual/advanced-many-to-many.html