You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,导致查询无结果。

修复方案

  1. 首先新增用户存在性校验,拿到查询结果后先判断是否为空再操作,避免直接操作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})
  }
  1. 排查token取值逻辑:打印后端拿到的token值,和数据库中存储的对应用户token做对比,确认是否一致。
  2. 排查User模型字段定义,确认存储重置token的字段名和查询字段名完全一致。

内容的提问来源于stack exchange,提问作者Papaja12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:27:05