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

Express应用创建帖子时req.user为undefined,如何获取当前登录用户

问题根因

req.user不存在是因为你没有在处理创建帖子请求的路由前,添加JWT校验中间件来解析请求携带的token,把对应用户信息挂载到req对象上。

解决步骤

1. 编写JWT校验中间件

新建middleware/authMiddleware.js文件,代码如下:

import jwt from 'jsonwebtoken';
import User from '../models/User.js'; // 替换为你自己User模型的实际路径

const protect = async (req, res, next) => {
  let token;
  // 校验请求头是否携带Bearer格式的token
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
    try {
      // 提取token本体(去掉前缀Bearer )
      token = req.headers.authorization.split(' ')[1];
      // 解密token获取用户id,秘钥要和生成token的秘钥保持一致
      const decoded = jwt.verify(token, 'abc123');
      // 查询用户信息(排除密码字段)挂载到req.user
      req.user = await User.findById(decoded.id).select('-password');
      next();
    } catch (error) {
      res.status(401);
      throw new Error('token无效,授权失败');
    }
  }

  if (!token) {
    res.status(401);
    throw new Error('未携带token,无权访问');
  }
};

export { protect };

2. 为创建帖子的路由绑定中间件

在你定义帖子路由的文件中,引入上述protect中间件,放在createPost处理函数之前生效:

// 示例路由配置,替换为你自己的路由定义规则
import { createPost } from '../controllers/postController.js';
import { protect } from '../middleware/authMiddleware.js';

router.route('/api/posts').post(protect, createPost);

3. Postman请求时正确携带token

调用登录接口拿到返回的token后,在创建帖子的请求头中添加配置:

  • Key填Authorization
  • Value填Bearer 你登录获取的token(注意Bearer和token之间需要加一个空格)

优化建议

  • JWT秘钥不要硬编码在业务代码中,建议放到.env环境变量里统一管理,避免秘钥泄露
  • 所有需要登录权限的接口都可以复用这个protect中间件做权限校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:36:02