Node.js密码重置时报TypeError: cannot set property "password" of null求助
错误根因
你遇到的TypeError: cannot set property "password" of null和语法错误无关,根本原因是User.findOne({token: token})数据库查询没有匹配到对应的用户文档,返回结果为null,你直接对null赋值password属性触发了该报错。
可能的触发原因
- 你代码中只判断了token存在,没有校验token有效性:可能该重置token已经被使用过(之前密码重置成功后你将
usertoken置空,旧token自然无法匹配到用户)、或者token传输过程中存在截断/编码异常。 - token取值逻辑错误:你贴出的后端代码没有展示
token变量的取值逻辑,可能你拿错了参数来源,比如前端把token放在请求头/URL参数里,后端错误从请求体取值,或者前后端token字段名不匹配,导致查询的token值本身就是错误的,自然查不到用户。 - 模型字段不匹配:User模型中存储重置token的字段名和你查询的
token不一致,比如字段实际为resetToken,查询时写的是token,导致查询无结果。
修复方案
- 首先新增用户存在性校验,拿到查询结果后先判断是否为空再操作,避免直接操作null:
const {newPassword} = req.body; // 这里确认你的token取值逻辑是正确的,比如是从URL参数取还是请求头取 const token = req.query.token; // 这里补全你实际的token取值逻辑 if(token && newPassword) { console.log("token and password exist"); User.findOne({token: token}).then(user=> { // 新增非空判断 if (!user) { return res.status(400).json({message:"重置链接无效或已过期",result:false}) } console.log("password" + newPassword); user.password = newPassword; user.usertoken = ""; user.save(function(err){ if(err)return next(err); else res.json({message:"Password changed",result:true}) }); }).catch(next) } else { res.status(400).json({message:"Missing information! The password could not be updated.",result:false}) }
- 排查token取值逻辑:打印后端拿到的token值,和数据库中存储的对应用户token做对比,确认是否一致。
- 排查User模型字段定义,确认存储重置token的字段名和查询字段名完全一致。
内容的提问来源于stack exchange,提问作者Papaja12
相关产品推荐
相关产品推荐

