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