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

React+Node.js+MongoDB密码重置时404 Not Found问题求助

密码重置时404错误的排查与修复

核心问题与修复步骤

1. 前端请求URL错误导致404

前端fetch请求的URL写死了路由占位符/resetPassword/:token2,既没有替换成实际的token2值,也与后端的POST路由不匹配(后端POST路由为/newpassword/:token2,/resetPassword/:token2对应的是PATCH方法)。

修改Newpassword组件的请求代码:

// 原错误代码
const res = await fetch(`/resetPassword/:token2`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ hashedPassword }),
});

// 修改后代码
const res = await fetch(`/newpassword/${token2}`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ password }),
});

2. 请求参数与后端预期不匹配

前端提前对密码进行哈希并以hashedPassword字段传递,但后端控制器期望接收password字段,且后端会自行处理密码哈希逻辑,前端提前哈希会导致密码重复加密。

移除前端的密码哈希步骤,直接传递原始密码:

// 移除这行代码
// const hashedPassword = bcryptjs.hashSync(password, 10);

// 请求体改为传递password字段
body: JSON.stringify({ password }),

3. 后端控制器的两处逻辑错误

  • 生成登录令牌时错误使用了模型User而非查询到的用户实例user,导致令牌无效
  • user.save()未添加await,可能出现数据库未完成更新就返回响应的情况

修改认证控制器的resetPassword函数:

// 原错误代码
user.save();
const logintokeen = signToken(User._id);

// 修改后代码
await user.save();
const logintokeen = signToken(user._id);

4. 冗余路由清理(可选优化)

后端同时定义了/resetPassword/:token2(PATCH方法)和/newpassword/:token2(POST方法)指向同一个控制器,容易造成混淆,建议保留其中一组路由即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:01:30