Nodejs中ejs的页面中有没有和jsp一样的内置对象?

Nodejs中ejs的页面中有没有和jsp一样的内置对象?

<p>jsp中有out,page,reqeust等内置对象,ejs的页面中有类似写法吗?</p>

<p>ejs的资料除了 https://github.com/visionmedia/ejs 中的readme意外,有没有其他资料了?</p>

<p><%= %>和<%- %>的unescape是什么意思?</p>

<p>谢谢。</p>


7 回复

Node.js 中 EJS 页面中的内置对象

JSP 内置对象 vs EJS 内置对象

在 JSP 中,有一些内置对象如 outpagerequest 等,它们可以直接在页面中使用,无需显式声明。那么在 EJS 中是否也有类似的内置对象呢?

EJS 中的内置对象

EJS 是一个简单易用的模板引擎,它提供了几个内置对象来帮助你处理数据和逻辑。这些内置对象主要包括:

  1. locals 对象:这是 EJS 中最常用的内置对象之一。你可以通过 locals 对象向 EJS 模板传递数据。
  2. app 对象(如果你使用 Express 框架):Express 提供了一些全局对象,如 appres
示例代码

假设你有一个简单的 Express 应用,并且你希望将一些数据传递给 EJS 模板:

const express = require('express');
const app = express();
const ejs = require('ejs');

// 设置视图引擎为 EJS
app.set('view engine', 'ejs');

// 定义路由
app.get('/', (req, res) => {
    // 使用 locals 对象传递数据
    res.locals.user = { name: 'John Doe' };
    res.render('index');
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中,我们定义了一个路由 /,并使用 res.locals 将用户对象传递给 EJS 模板。然后,在 EJS 模板中,我们可以直接访问 user 对象:

<!-- views/index.ejs -->
<!DOCTYPE html>
<html>
<head>
    <title>EJS Example</title>
</head>
<body>
    <h1>Welcome, <%= user.name %></h1>
</body>
</html>

在这个例子中,<%= user.name %> 就是访问 locals 对象中的 user 对象的属性。

<%=<%- 的含义

<%=<%- 在 EJS 中用于不同的目的:

  • <%=:用于输出变量的内容,并且会自动转义 HTML 特殊字符(如 <, >, & 等),以防止 XSS 攻击。
  • <%-:用于输出变量的内容,但不会进行转义,这可能会导致 XSS 攻击的风险。

例如:

<!-- views/index.ejs -->
<h1><%= '<script>alert("XSS")</script>' %></h1> <!-- 输出 &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt; -->
<h1><%- '<script>alert("XSS")</script>' %></h1> <!-- 输出 <script>alert("XSS")</script> -->

总结来说,EJS 提供了一些内置对象和标签,可以方便地处理数据和逻辑。虽然没有像 JSP 那样的 outpage 对象,但 locals 和 Express 的 app 对象提供了类似的功能。


Unbuffered code for conditionals etc <% code %>
不会有缓存的(就是不会生成值的)代码(用来控制逻辑的)
Escapes html by default with <%= code %>
默认转化为 html 的代码
Unescaped buffering with <%- code %>
不转化为 html 且有产生值的代码

个人的理解
仅供参考

在ejs的模版中可以使用的对象有request和response对象。 比如你在session中存储了用户信息user.包含有username和email地址。那么你在模版中可以用一下方法调用:

当前登录用户:<%=request.session.user.username%>
邮件地址:<%=request.session.user.emal%>

Escapes html by default with <%= code %> 默认转化为 html 的代码 这就好比如果这个code中内容如下

<b>你好么</b>

使用<%=code%>时,页面看到就是: <b>你好么</b>

使用<%-code%>时,页面看到就是: 你好么

看到了,今天上线时修复

不知道你说的request和response对象是在哪个环境下提供的?我用的Express框架。 不知道你的信息是从那里获取来的?直接看的源代码吗?

您好,运行提示request is not defined session is not defined

在Node.js中使用EJS模板引擎时,并没有与JSP中完全相同的内置对象。不过,EJS提供了几种内置变量和一些默认对象,可以在模板中直接使用。

  1. 内置变量:

    • locals: 这个对象包含通过res.render('templateName', locals)传递给模板的数据。
    • settings: 包含一些EJS的配置选项。
  2. 默认对象:

    • requestresponse: 如果你在Express框架中使用EJS,这些对象会自动传递给模板。
    • app: 应用实例(如果你需要访问应用级别的设置)。

示例代码

假设你使用Express来渲染一个EJS模板:

// app.js
const express = require('express');
const app = express();

app.set('view engine', 'ejs');

app.get('/', (req, res) => {
    const data = {
        title: 'Hello EJS',
        message: 'Welcome to my page!'
    };
    res.render('index', data);
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

views/index.ejs文件中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <h1><%= message %></h1>
    <p>Request URL: <%= request.url %></p>
    <p>Response Status: <%= response.statusCode %></p>
</body>
</html>

在这个例子中:

  • <%= title %> 使用了传递给模板的data对象中的title属性。
  • <%= request.url %><%= response.statusCode %> 使用了通过Express传递给模板的requestresponse对象。

解释

  • <%= %>: 输出不转义的内容。
  • <%- %>: 输出内容并且不转义,通常用于包含外部文件或HTML片段。

关于unescape问题,<%- %> 是用来输出未经转义的内容,而<%= %> 默认会转义输出以防止XSS攻击。因此,<%- %> 可以理解为"不要转义"的意思。

希望这些信息对你有所帮助!如果你还有其他问题,请继续提问。

回到顶部