Nodejs express3.0 ejs模板的里面判断变量是否存在报错?
Nodejs express3.0 ejs模板的里面判断变量是否存在报错?
<% if (user) { %> xxx <% } %>
如果没有把这个变量输出在这个模板上,为什么网页上会报 user is not defined
这样写似乎可以,不过太难看了
<% if (typeof user !== ‘undefined’ ) %> xxx <% } %>
我看cnode里面用到了locals.user来判断就可以了,不知道3.0有没有解决办法?
<% if (locals.user) { %> xxx <% } %>
Node.js Express 3.0 EJS 模板中判断变量是否存在时遇到问题
问题描述
在使用 EJS 模板引擎时,尝试判断某个变量(如 user
)是否存在,并根据其存在与否来渲染不同的页面内容。但当该变量未定义时,页面会出现错误信息 “user is not defined”。
示例代码及解释
错误代码示例:
<% if (user) { %>
<p>Welcome, <%= user.name %></p>
<% } %>
问题原因:
当你直接在 EJS 模板中引用一个未定义的变量(如 user
),EJS 引擎会抛出一个错误,因为它无法找到这个变量。
解决方案
方法一:检查变量类型
你可以通过检查变量是否为 undefined
来避免错误:
<% if (typeof user !== 'undefined') { %>
<p>Welcome, <%= user.name %></p>
<% } %>
方法二:使用 locals
对象
在 Express 中,可以通过 res.locals
向模板传递数据。这样,你可以在模板中安全地访问这些数据:
// 在路由处理函数中设置 locals
app.get('/', function(req, res) {
res.locals.user = { name: 'John Doe' };
res.render('index');
});
然后在模板中这样使用:
<% if (locals.user) { %>
<p>Welcome, <%= locals.user.name %></p>
<% } %>
方法三:默认值 另一种优雅的方法是给变量提供一个默认值:
<% var user = user || {}; %>
<% if (user.name) { %>
<p>Welcome, <%= user.name %></p>
<% } %>
总结
在 EJS 模板中判断变量是否存在时,需要确保变量已被正确定义或通过 locals
对象传递到模板中。以上方法可以帮助你避免在未定义变量时出现错误。
还是没明白。望大神指教。
在使用 Node.js 的 Express 3.0 框架结合 EJS 模板引擎时,如果在 EJS 模板中直接检查 user
变量是否存在,可能会遇到未定义的情况。这是因为变量作用域的问题。
解决方案
-
使用
locals
对象在 Express 中,可以通过
res.locals
对象来设置模板的局部变量。这样,在 EJS 模板中可以直接通过locals.user
来访问该变量。// 在路由处理函数中 app.get('/', function(req, res) { res.locals.user = { name: 'John Doe' }; // 设置用户信息 res.render('index'); // 渲染模板 });
在 EJS 模板中:
<% if (locals.user) { %> <p>User is logged in: <%= locals.user.name %></p> <% } else { %> <p>No user is logged in.</p> <% } %>
-
使用默认值
如果你不希望总是使用
locals
对象,可以在传递给 EJS 模板的数据中包含默认值。// 在路由处理函数中 app.get('/', function(req, res) { const user = req.session.user || null; res.render('index', { user: user }); });
在 EJS 模板中:
<% if (user) { %> <p>User is logged in: <%= user.name %></p> <% } else { %> <p>No user is logged in.</p> <% } %>
这两种方法都可以避免在 EJS 模板中直接检查 user
变量是否存在的问题。第一种方法利用了 res.locals
对象来确保变量在模板上下文中可用,而第二种方法则是在数据传递阶段就进行了变量的存在性检查。