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
相关产品推荐
相关产品推荐

