【问题标题】:Cannot access Sequelize instance methods无法访问 Sequelize 实例方法
【发布时间】:2017-10-12 17:46:19
【问题描述】:

当我尝试调用在我的用户模型上定义的generateHash 实例方法时,我收到以下错误:

User.generateHash(...).then is not a function

这是模型定义本身:

const User = sequelize.define('User', 
{
    firstName: {
        type: Sequelize.TEXT,
        field: 'first_name'
    },
    lastName: {
        type: Sequelize.TEXT,
        allowNull: false,
        field: 'last_name'
    },
    userName: {
        type: Sequelize.TEXT,
        field: 'user_name',
        allowNull: false
    },
    password: {
        type: Sequelize.TEXT,
        allowNull: false
    }
}, {
    tableName: 'users',
    underscored: true,
    classMethods: {
        associate: function(models) {
            User.hasMany(
      models.Trip,
                {
                    as: 'trips',
                    foreignKey: {
                        name: 'userId',
                        field: 'user_id',
                        allowNull: false
                    },
                    onDelete: 'CASCADE'
                });
        },
    },
    instanceMethods: {
        generateHash: function(password) {
            return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },
        validatePassword: function(password) {
            return bcrypt.compareSync(password, this.password);
        },
        apiRepr: function() {
            return {
                id: this.id,
                firstName: this.firstName,
                lastName: this.lastName,
                userName: this.userName
            };
        }
    }
});

这是我尝试调用该方法的端点:

router.post('/', (req, res) => {
let {userName, password, firstName, lastName} = req.body;

// if no existing user, hash password
return User.generateHash(password)
    .then(hash => {
        // create new user
        return User.create({
            firstName: firstName,
            lastName: lastName,
            userName: userName,
            password: hash
        });
    })
    .then(user => {
        // send back apirRepr data
        return res.status(201).json(user.apiRepr());
    })
    // error handling
    .catch(err => {
        if (err.name === 'AuthenticationError') {
            return res.status(422).json({message: err.message});
        }
        res.status(500).json({message: 'Internal server error'});
    });});

我完全被困住了。有什么想法吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    在 sequelize V4 中删除了类和实例方法。 现在你必须这样做:

    const Model = sequelize.define('Model', {
        ...
    });
    
    // Class Method
    Model.associate = function (models) {
        ...associate the models
    };
    
    // Instance Method
    Model.prototype.someMethod = function () {..}

    更多信息在这里Sequelize v4 breaking changes

    【讨论】:

      【解决方案2】:

      你正在调用 .then() 的东西没有返回一个承诺。试试这个:

      router.post('/', (req, res) => {
      let {userName, password, firstName, lastName} = req.body;
      let hash = User.generateHash(password);
      // if no existing user, hash password
      return User.create({
              firstName: firstName,
              lastName: lastName,
              userName: userName,
              password: hash
          })
          .then(user => {
              // send back apirRepr data
              return res.status(201).json(user.apiRepr());
          })
          // error handling
          .catch(err => {
              if (err.name === 'AuthenticationError') {
                 return res.status(422).json({message: err.message});
              }
              return res.status(500).json({message: 'Internal server error'});
          });
      

      【讨论】:

      • 谢谢!我最终实施了一个类似的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2017-11-07
      • 1970-01-01
      • 2021-09-22
      相关资源
      最近更新 更多