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

Node.js API中JWT生成失败求助:登录无法匹配MongoDB用户

解决JWT登录验证中“用户未找到”及Token生成问题

看起来你遇到了两个核心问题:MongoDB查询条件格式错误导致匹配不到用户,以及JWT参数拼写错误会导致后续Token生成失败。咱们一步步来修复:

1. 修复MongoDB查询条件

你当前的查询代码存在格式问题:

var user = { userName : request.body.userName, password : request.body.password }
userList.findOne({user},function(error,user){...})

这里的{user}会被解析成{ user: { userName: "...", password: "..." } },但你的MongoDB文档里userName和password是顶级字段,并非嵌套在user对象中,所以完全匹配不到数据库里的用户数据。

正确的写法是直接将userName和password作为查询条件:

// 先解构请求体参数,代码更清晰
const { userName, password } = request.body;
// 使用顶级字段直接查询
userList.findOne({ userName, password }, function(error, foundUser) {
  // 这里把变量名改成foundUser,避免和上面的参数变量冲突
  ...
})

2. 修复JWT签名的参数错误

你代码里的expiressInMinutes是拼写错误,正确的参数名是expiresIn;而且JWT的过期时间格式需要符合规范,可以用字符串(比如'1440m'代表1440分钟)或者秒数(比如86400代表一天)。另外不要把整个用户对象传入JWT,因为里面包含密码等敏感信息,只需要传入用户标识(比如_id、userName)即可。

修正后的Token生成代码:

var token = jwt.sign(
  { _id: foundUser._id, userName: foundUser.userName }, // 仅传入必要的非敏感信息
  process.env.SECRET_KEY,
  { expiresIn: '1440m' } // 正确的参数名和格式
);

完整修正后的/loginUser接口代码

app.post('/loginUser', (request, response) => {
  const { userName, password } = request.body;
  userList.findOne({ userName, password }, function(error, foundUser) {
    if (error) {
      console.log(error);
      return response.status(500).send("Unable to sign in");
    }
    if (!foundUser) {
      return response.status(404).send("No user found");
    } else {
      // 生成JWT Token,仅包含非敏感用户信息
      var token = jwt.sign(
        { _id: foundUser._id, userName: foundUser.userName },
        process.env.SECRET_KEY,
        { expiresIn: '1440m' }
      );
      return response.json({
        success: true,
        Message: 'Check your token!',
        token: token
      });
    }
  });
});

额外建议

  • 永远不要明文存储密码!目前你的数据库里是明文密码,存在极大安全隐患,建议使用bcrypt等库对密码进行哈希后再存储,登录时比对哈希值。
  • 尽量使用async/await替代回调函数,代码的可读性和错误处理能力会更强。

现在用Postman重新发送请求,应该就能正确匹配到用户并生成JWT Token了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:47:50