为何Passport使用req.user而非标准的res.locals.user?
req.user而非res.locals.user? 这问题问到点子上了,其实Passport.js的这个设计是经过考量的,核心原因可以归结为这几点:
职责边界清晰:Passport的定位是身份验证中间件,它的核心任务就是完成用户身份的校验,把验证后的用户信息绑定到请求对象上。而
res.locals是Express专为视图层准备的数据容器,属于“响应渲染”环节的范畴。Passport只专注于自己的身份验证本职工作,至于要不要把用户数据传递给视图,那是开发者后续根据业务需求决定的事——毕竟不是所有场景都需要给视图传用户信息(比如纯后端API服务,只需要用req.user做权限校验)。跨框架兼容性:Passport不止能和Express配合,还兼容所有基于Connect的Node.js框架。
res.locals是Express特有的属性,而req.user是整个Connect中间件生态里更通用的约定,早期很多身份验证中间件都采用这种方式。Passport沿用这个约定,能更好地融入整个生态,也让开发者在切换框架时减少代码改动。请求生命周期的一致性:用户身份是和当前请求强绑定的,从请求进入服务器开始,到后续的路由处理、权限校验、甚至错误处理,整个流程的各个环节都可能需要用到用户信息。把数据挂在
req上,能保证在请求生命周期的任何阶段都能便捷获取;而res.locals主要服务于视图渲染阶段,在更早的中间件环节使用它的场景相对有限。保留开发者的灵活性:Passport不会替你做决定,如果你需要把用户数据放到
res.locals供视图使用,只需要加一行简单的中间件就能实现:
app.use((req, res, next) => { res.locals.user = req.user; next(); });
这种设计既保持了Passport的通用性,又能满足不同业务场景的个性化需求,比直接默认把数据塞进res.locals要灵活得多。
内容的提问来源于stack exchange,提问作者sdgfsdh

