Node.js中为何用locals.id而非res.id?EJS显示短ID原理解惑
问题解答
一、为什么用locals.id而非res.id?
- Express的
res对象是处理HTTP响应的核心对象,它本身没有id这个内置属性,直接访问res.id只会得到undefined,根本无法获取到你要传递的短ID数据。 res.locals是Express专门设计的视图数据载体,框架会自动把这个对象中的所有属性注入到模板的渲染上下文里,是后端向前端模板传递数据的标准方式。你在后端代码里应该是通过类似res.locals.id = generatedShortId的方式把短ID赋值进去的,所以前端模板只能通过locals.id(或直接用id)来访问,而不是res.id。
二、这段EJS代码的工作原理与locals.id的作用
先看格式化后的EJS代码:
<% if (locals.id) { %> <p>URL Generated: https://localhost:8000/url/<%= id%></p> <% } %>
具体原理:
- 上下文注入:当Express调用
res.render()渲染EJS模板时,会把res.locals对象作为模板的全局渲染上下文。也就是说,res.locals里的所有属性都会成为模板中可直接访问的变量。 - 变量存在性判断:
locals.id是显式检查渲染上下文中是否存在id变量。如果后端没有传递id(比如用户还没提交长URL生成短链时),locals.id会是undefined,此时不会渲染这段URL提示;只有当后端通过res.locals.id传入了短ID,条件才成立,才会显示生成的短链接。 - 直接访问变量:模板里的
<%= id%>能正常工作,是因为EJS已经把res.locals.id注入到了模板的全局作用域,直接使用变量名即可。locals.id作为显式访问上下文对象的写法,优势在于:如果直接写if (id),当id未定义时会抛出引用错误,而locals.id只会返回undefined,条件不成立,避免报错。
内容的提问来源于stack exchange,提问作者Abir Banerjee
相关产品推荐
相关产品推荐

