Express.js登录路由自定义函数失效:user.isValidPassword不是函数
问题解决:
user.isValidPassword is not a function 错误修复 核心问题分析
你的代码存在两个关键错误导致该问题:
- 实例方法定义错误:Mongoose的实例方法需要挂载到
schema.methods对象(复数形式),你写成了schema.method(单数),导致方法未被正确绑定到用户实例。 - 箭头函数
this指向异常:isValidPassword使用箭头函数,箭头函数不会绑定自身的this,既无法访问实例的password属性,也无法被识别为合法的实例方法。
修复后的user.model.js关键代码
替换原isValidPassword方法的错误写法:
// 正确的实例方法定义 userSchema.methods.isValidPassword = async function(password) { return await bcrypt.compare(password, this.password); }
额外优化点
- 注册环节的JWT生成代码有误:原代码
const token = await userModel.generateJWT;应改为实例调用,且该方法为同步方法无需await,正确写法:const token = user.generateJWT(); - 确保注册时密码已通过
hasPassword静态方法加密存储,否则即使修复登录逻辑,密码对比仍会失败。
验证修复
重启服务后,发送登录请求:
{ "email": "test@test.com", "password": "thisistestpassword" }
此时应能正常完成密码校验,返回用户信息与JWT令牌。
内容的提问来源于stack exchange,提问作者Tejashv
相关产品推荐
相关产品推荐

