sequelize.jspassword-storage

Sequelize: don't return password


I'm using Sequelize to do a DB find for a user record, and I want the default behavior of the model to not return the password field for that record. The password field is a hash but I still don't want to return it.

I have several options that will work, but none seems particularly good:

  1. Create a custom class method findWithoutPassword for the User model and within that method do a User.find with the attributes set as shown in the Sequelize docs

  2. Do a normal User.find and filter the results in the controller (not preferred)

  3. Use some other library to strip off unwanted attributes

Is there a better way? Best of all would be if there is a way to specify in the Sequelize model definition to never return the password field, but I haven't found a way to do that.


Solution

  • I would suggest overriding the toJSON function:

    sequelize.define('user', attributes, {
      instanceMethods: {
        toJSON: function () {
          var values = Object.assign({}, this.get());
    
          delete values.password;
          return values;
        }
      }
    });
    

    Or in sequelize v4

    const User = sequelize.define('user', attributes, {});
    
    User.prototype.toJSON =  function () {
      var values = Object.assign({}, this.get());
    
      delete values.password;
      return values;
    }
    

    toJSON is called when the data is returned to the user, so end users won't see the password field, but it will still be available in your code.

    Object.assign clones the returned object - Otherwise you will completely delete the property from the instance.