Nodejs中为什么ejs里的if不起作用?

Nodejs中为什么ejs里的if不起作用?

我的ejs模板是这样子的: <% if(error){ %> <%- include error.html %> <% }%>

在测试的时候,按理传入的response里没有error的时候,error.html是不加载的 但是我测试出来的结果它不管error是否为真都加载. 是我写错了还是ejs有问题?0.8.4版本的

3 回复

当然可以。让我们来分析一下你遇到的问题,并提供一个简洁明了的解答。

问题描述

你希望在EJS模板中根据条件来决定是否包含某个部分,但发现<% if(error) { %> ... <% } %> 这种语法无论 error 是否存在都会执行包含的部分。

解释与解决方案

在EJS模板引擎中,<% %> 是用来插入JavaScript代码的标签。如果你传递给模板的变量 error 存在且不为空,那么条件语句应该正常工作。但你提到的情况表明,即使 error 不存在或为空,error.html 仍然被包含进来。

示例代码

假设你的Node.js后端代码如下:

app.get('/test', (req, res) => {
    // 注意这里error可能不存在
    res.render('template', { error: req.query.error });
});

你的EJS模板文件 template.ejs 可能长这样:

<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <% if(error) { %>
        <!-- 如果error存在,则包含error.html -->
        <%- include 'error.html' %>
    <% } %>
</body>
</html>

常见问题排查

  1. 检查变量传递:确保 error 确实被正确地传递到模板中。
  2. EJS版本问题:你提到使用的是0.8.4版本,这可能是较旧的版本,建议升级到最新版本以避免已知的bug。
  3. 变量类型:确保 error 不仅存在而且是非空值。如果 error 是一个空字符串或者 nullif 条件也会失败。

调试技巧

你可以添加一些调试信息来确认 error 的值:

<% if(error) { %>
    <!-- 包含error.html -->
    <%- include 'error.html' %>
<% } else { %>
    <!-- 输出error的值进行调试 -->
    <p>Error is: <%= error %></p>
<% } %>

这样你可以确认 error 的实际值,并进一步排查问题。

总结

通常情况下,<% if(error) { %> ... <% } %> 这样的语法在EJS中应该能够正常工作。如果你遇到了问题,可以尝试上述方法来排查原因,包括检查变量传递、EJS版本以及变量的实际值。


if(error !== null)

根据你的描述,问题可能出在传入到 EJS 模板的数据上。EJS 模板中的 <%-<% 语法用于输出 HTML 和执行 JavaScript 代码。如果你传递给 EJS 模板的 error 变量是一个空字符串、空数组或其他类似假值(falsy)的变量,那么条件判断可能会失败。

你可以尝试确保 error 是一个明确的布尔值。以下是示例代码和一些调试建议:

示例代码

// 确保 `error` 是一个明确的布尔值
const response = {
    error: true // 或者 false
};

// 渲染 EJS 模板
app.get('/your-route', (req, res) => {
    res.render('your-template', response);
});

调试建议

  1. 检查传入的数据:在渲染模板之前,先打印出 response 对象,确保 error 的值是你期望的。

    console.log(response);
    
  2. 确保模板文件路径正确:确保 error.html 文件路径正确,并且文件存在。

  3. 更新 EJS 版本:如果你使用的是旧版本的 EJS (如 0.8.4),考虑升级到最新版本,因为可能存在已修复的 bug。

如果以上步骤都不能解决问题,请提供更多的代码细节以便进一步排查。

回到顶部