'I have got this error when I try to make post request in postman " { "success": false, "error": "user.matchPassword is not a function" }
I have received this in postman when I try to run login route. I have used mongodb atlas and nodejs 14.17.0 version. Please help me to fix this error. This code was fond in YouTube tutorial. That code work for him but It is not working for me. { "success": false, "error": "user.matchPassword is not a function" }
Schema file
const mongoose = require('mongoose')
const bcrypt = require('bcryptjs')
//-------------------------------------------------------------------------------------
//------------- User Schema -------------
const UserSchema = new mongoose.Schema({
username: {
type: String,
required: [true, 'Please provide username'],
},
email: {
type: String,
required: [true, 'Please provide email address'],
unique: true,
},
password: {
type: String,
required: [true, 'Please add a password'],
minlength: 6,
select: false,
},
resetPasswordToken: String,
resetPasswordExpire: Date,
})
//------------- password encription before saving the schema -------------
UserSchema.pre('save', async function (next) {
if (!this.isModified('password')) {
next()
}
const salt = await bcrypt.genSalt(10)
this.password = await bcrypt.hash(this.password, salt)
next()
})
//------------- password checking for login -------------
UserSchema.methods.matchPassword = async function (password) {
return await bcrypt.compare(password, this.password)
}
const User = mongoose.model('User', UserSchema)
module.exports = User
Loginrouter function This is my login router function
//------------- Login route -------------
exports.login = async (req, res, next) => {
const { email, password } = req.body
if (!email || !password) {
res
.status(400)
.json({ success: false, error: 'Please provide email and paswword.' })
}
try {
const user = User.findOne({ email }).select('+password')
if (!user) {
res.status(404).json({ success: false, error: 'Invalid credentials.' })
}
const isMatch = await user.matchPassword(password)
if (!isMatch) {
res.status(404).json({ success: false, error: 'Invalid credentials' })
}
res.status(200).json({ success: true, token: '12646dfsdhf' })
} catch (error) {
res.status(500).json({ success: false, error: error.message })
}
}
Solution 1:[1]
Inside your Login Router function.
try {
const user = await User.findOne({ email }).select('+password')
}
Just add the await keyword for finding the user with the required fields.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Tyler2P |
