Search code examples
node.jsmongodbmongoose-schema

Mongoose Schema: TypeError: Cannot set property 'generateAuthToken' of undefined


I am trying to create a method to userSchema however I get this error:

TypeError: Cannot set property 'generateAuthToken' of undefined

userSchema.methods.generateAuthToken = function() {
  // const token = jwt.sign({ _id: user._id }, config.get("JWTPRIVATEKEY"));
  const token = jwt.sign({ _id: this._id }, "Privatekey");
  return token;
};

Note: I am not using arrow function instead its a normal function:

var userSchema = {
  name: {
    type: String,
    require: true
  },
  email: {
    type: String,
    require: true,
    unique: true
  },
  password: {
    type: String
  }
};

userSchema.methods.generateAuthToken = function() {
  // const token = jwt.sign({ _id: user._id }, config.get("JWTPRIVATEKEY"));
  const token = jwt.sign({ _id: this._id }, "Privatekey");
  return token;
};

const User = mongoose.model("Users", new mongoose.Schema(userSchema));

function validateUser(user) {
  let schema = {
    name: Joi.string().required(),
    email: Joi.string()
      .required()
      .email(),
    password: Joi.string().required()
  };

  return Joi.validate(user, schema);
}

exports.User = User;
exports.validateUser = validateUser;

Use case

  let user = await User.findOne({ email: req.body.email });

  const token = user.generateAuthToken();

Solution

  • The problem is your userSchema just a normal object not a Schema Object. So it doesn't have methods property (your userSchema.methods is undefined) so when you set userSchema.methods.generateAuthToken, it will throw an Error.

    Please take a look at the document https://mongoosejs.com/docs/guide.html#methods

    You should define Schema object first

    var userSchema = new mongoose.Schema({
      name: {
        type: String,
        require: true
      },
      email: {
        type: String,
        require: true,
        unique: true
      },
      password: {
        type: String
      }
    });