20

Can someone help me understand how to use instance methods in Sequelize? I've reviewed the documentation but have found it to be sparse. At present, I am trying to use setPassword and verifyPassword instance methods on my user model. When I try to call the code in the REPL, after having imported the user model and synced the DB, I get the following:

> models.User.setPassword('test');
TypeError: Object [object Object] has no method 'setPassword'

Here is the code for the user model:

var bcrypt = require('bcrypt');

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('User', {
    email: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { isEmail: true } },
    password: { type: DataTypes.STRING, allowNull: false},
    firstName: {type: DataTypes.STRING},
    lastName: {type: DataTypes.STRING},
    companyName: {type: DataTypes.STRING},
    admin: {type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false,},
    forgotUrl: {type: DataTypes.STRING, unique: true},
    forgotDate: {type: DataTypes.STRING},
    lastLogin: {
      type: DataTypes.DATE,
      defaultValue: DataTypes.NOW
    }
  }, {
    paranoid: true,
    instanceMethods: {
      setPassword: function(password, done) {
        return bcrypt.genSalt(10, function(err, salt) {
          return bcrypt.hash(password, salt, function(error, encrypted) {
            this.password = encrypted;
            this.salt = salt;
            return done();
          });
        });
      },
      verifyPassword: function(password, done) {
        return bcrypt.compare(password, this.password, function(err, res) {
          return done(err, res);
        });
      }
    }
  });
};
2
  • Why the returns before all your callback calls? Commented Dec 11, 2014 at 20:52
  • 3
    the use of this in the setPassword instance method will fail to refer to the actual User instance. Commented Sep 12, 2015 at 0:18

2 Answers 2

16

Instance method can be used on specific element instances eg.

models.User.find(123).success( function( user ) { 
    user.setPassword('test');
});
Sign up to request clarification or add additional context in comments.

3 Comments

Ahh, that makes perfect sense. Do you have any idea why I am getting TypeError: undefined is not a function from return done() when I run: > models.User.find(1).success( function( user ) { user.setPassword('password'); });
no idea . I'm using this construct in my project without a problem
surfearth. "done" is the second parameter to setPassword, which has to be a function as you call it "return done();". You aren't passing in a parameter, so "done" is undefined and is not a function.
3

You define the function as: function(password, done)

Yet you don't supply the done parameter. Thus, the function leaves done as undefined and calling done() is executing an undefined function.

You could fix this in 3 ways:

  1. Default done to a noop function function () {}
  2. Only return done() if done is defined
  3. Supply a done callback when calling the instance function.

The alternative is to refactor it to return a promise which it resolves on completion.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.