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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:12:41