res.locals是什么?请求作用域含义及视图可访问该属性的来源解析
问题1:「scoped to the request(限定为请求作用域)」的具体含义
res.locals的生命周期完全和单个HTTP请求绑定:
- 每收到一个新的客户端请求,Express都会生成一个全新的空白res.locals对象,仅归属本次请求使用
- 本次请求处理完成、响应返回给客户端后,对应的res.locals对象会被立即销毁,不会留存任何数据
- 不同用户的请求、同一个用户发起的多个独立请求,各自的res.locals完全隔离,数据不会互相干扰。比如你在用户A的登录请求里给res.locals.user赋值为A的账号信息,用户B的请求完全访问不到这个值,同个用户第二次发起的首页请求也无法直接读取该值,必须重新赋值。
问题2:视图中可访问该对象的原因、属性来源
这是Express内置的模板渲染机制决定的:
- 当你调用
res.render(视图路径, 自定义参数)方法渲染EJS等模板时,Express内部会自动合并三类变量:全局应用级变量app.locals、本次请求的res.locals、你调用render方法时传入的自定义参数对象,三类变量重名时的优先级为:自定义参数 > res.locals > app.locals - 合并完成后的所有变量会被整体注入到模板的运行上下文中,EJS里的
locals对象就是这个合并后变量集合的直接引用,所以你可以直接在模板里访问到res.locals里定义的所有属性。
你示例中的<%= locals.title %>就是按照上述优先级查找对应值输出的:先找render时传入的title参数,没找到就去res.locals中查找,仍未找到就去全局app.locals中查找。
内容的提问来源于stack exchange,提问作者Shivam Singh
相关产品推荐
相关产品推荐

