无法在User Controller中获取isLoggedIn中间件设置的req.user数据
问题:无法在控制器中访问req.user(中间件数据传递失败)
实现isLoggedIn中间件后,User Controller中无法访问req.user,既无法在中间件中成功将用户数据存入req.user,也无法将req.user从中间件传递到控制器。
相关代码片段
User Controller代码
exports.getLoggedInUserDetails = BigPromise(async (req, res, next) => { const user = await User.findById(req.user.id) console.log(user) res.status(200).json({ success:true, user }) });
User Middleware代码
const User = require('../models/user') const BigPromise = require("../middleware/bigPromise"); const CustomError = require("../utils/customError"); const jwt = require('jsonwebtoken') exports.isLoggedIn = BigPromise(async(req,res,next)=>{ const token = req.cookies.token if (!token) { return next(new CustomError("Login first to access this page", 401)); } const decoded = jwt.verify(token , process.env.JWT_SECRET) console.log(decoded) req.user = User.findById(decoded.id) next(); })
路由配置
router.route("/userdashboard").get(isLoggedIn, getLoggedInUserDetails);
解决方案
核心问题是中间件中异步操作未等待完成:User.findById(decoded.id)是异步方法,返回Promise对象,未加await直接赋值给req.user会导致req.user是未兑现的Promise,而非实际用户数据。控制器中访问req.user.id时该属性不存在,进而导致后续查询失败。
修正后的中间件代码
const User = require('../models/user') const BigPromise = require("../middleware/bigPromise"); const CustomError = require("../utils/customError"); const jwt = require('jsonwebtoken') exports.isLoggedIn = BigPromise(async(req,res,next)=>{ const token = req.cookies.token if (!token) { return next(new CustomError("Login first to access this page", 401)); } const decoded = jwt.verify(token , process.env.JWT_SECRET) // 加上await,等待异步查询完成后获取用户对象 req.user = await User.findById(decoded.id) next(); })
优化控制器代码(可选)
中间件已完成用户查询并赋值req.user,控制器无需重复查询数据库,直接使用即可:
exports.getLoggedInUserDetails = BigPromise(async (req, res, next) => { console.log(req.user) res.status(200).json({ success:true, user: req.user }) });
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

