如何修复Express+Node.js中图书评论接口的登录验证问题?
问题分析与解决方案
核心问题
你的代码缺少JWT验证中间件:登录接口生成令牌后,评论接口没有解析请求头中的JWT令牌、验证有效性并将用户信息挂载到req.user的逻辑,导致req.user为undefined,最终触发"User not logged in"的错误提示。
具体修复步骤
1. 添加JWT验证中间件
在regd_users路由定义后,新增用于验证JWT的中间件函数:
// JWT验证中间件 const verifyToken = (req, res, next) => { // 从请求头获取Authorization字段 const authHeader = req.headers.authorization; if (authHeader) { // 提取Bearer后的令牌部分 const token = authHeader.split(' ')[1]; // 验证令牌有效性 jwt.verify(token, "access", (err, user) => { if (err) { return res.status(403).json({ message: "Invalid or expired token" }); } // 将验证通过的用户信息挂载到req.user req.user = user; next(); }); } else { return res.status(401).json({ message: "User not logged in" }); } };
2. 为评论接口应用中间件
修改评论路由,在处理函数前添加verifyToken中间件,确保只有验证通过的用户才能访问:
// 应用JWT验证中间件后处理评论请求 regd_users.put("/auth/review/:isbn", verifyToken, (req, res) => { const isbn = req.params.isbn; const review = req.body.review; const username = req.user.username; // 现在req.user由中间件正确赋值 // 原有评论处理逻辑保持不变 if (books.hasOwnProperty(isbn)) { const book = books[isbn]; if (book.reviews.hasOwnProperty(username)) { book.reviews[username].review = review; return res.status(200).json({ message: "Review modified successfully" }); } else { book.reviews[username] = { username: username, review: review, }; return res.status(200).json({ message: "Review added successfully" }); } } else { return res.status(404).json({ message: "Book not found" }); } });
3. 检查Postman请求格式
调用评论接口时,确保请求头格式正确:
- 键:
Authorization - 值:
Bearer <你的JWT令牌>(注意Bearer与令牌之间有空格)
额外建议
- 生产环境不要使用硬编码密钥
"access",建议从环境变量读取,比如process.env.JWT_SECRET。 - 可以将
verifyToken中间件直接应用到regd_users路由组:regd_users.use(verifyToken),这样该组下所有接口都会自动验证JWT。
内容的提问来源于stack exchange,提问作者Ebi_Koch
相关产品推荐
相关产品推荐

