Saturday, 13 May 2017

Cannot access Sequelize instance methods

I get the following error when I attempt to call the generateHash instance method I've defined on my User model:

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

Here's the model definition itself:

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
            };
        }
    }
});

Here's the endpoint where I attempt to call the method:

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'});
    });

});

I'm totally stuck. Any ideas?



via Blake Sager

No comments:

Post a Comment