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

