Nodejs中怎么在ejs中访问res.locals.XXX的值

Nodejs中怎么在ejs中访问res.locals.XXX的值

《Node.js开发指南》的微博实例中,

var success = req.flash('success');
res.locals.success = success;`

但是在layout.ejs中用locals.success却访问不到,请问是怎么回事?有什么办法能够访问的?

6 回复

当然可以。以下是关于如何在 EJS 模板中访问 res.locals 中的值的详细说明。

Node.js 中如何在 EJS 中访问 res.locals.XXX 的值

在 Express 应用程序中,你可以通过 res.locals 来存储一些可以在模板中使用的数据。这些数据可以在 EJS 模板中直接访问。下面是一个简单的例子来展示如何实现这一点。

示例代码

首先,我们假设你有一个 Express 应用程序,并且使用 EJS 作为视图引擎。

  1. 设置 Express 应用程序
const express = require('express');
const app = express();

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

// 一个简单的路由
app.get('/', (req, res) => {
    // 将数据存储到 res.locals
    res.locals.success = '操作成功';
    
    // 渲染 EJS 模板
    res.render('index');
});

app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));
  1. 创建 EJS 模板文件 index.ejs
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>示例页面</title>
</head>
<body>
    <h1>欢迎来到示例页面</h1>
    <% if (locals.success) { %>
        <div style="color: green;">
            <%= locals.success %>
        </div>
    <% } %>
</body>
</html>

在这个例子中,我们在路由处理函数中将 success 存储到了 res.locals 对象中,然后在 EJS 模板中通过 <%= locals.success %> 访问该值。

问题分析

在你的问题描述中,你提到在 layout.ejs 中无法访问 locals.success。这可能是由于以下原因:

  1. 作用域问题:确保你在渲染具体的视图(如 index.ejs)时已经设置了 locals.success
  2. 布局文件中的作用域:如果你使用了布局文件(例如 layout.ejs),确保在具体视图中传递的数据能够被正确地继承到布局文件中。

解决方案

确保在渲染视图时设置 locals.success,并且在布局文件中正确地访问它。如果 layout.ejs 中没有直接访问 locals.success,可能是因为它在具体的视图中被渲染。

希望这能解决你的问题!


没用过ejs, 不过目测是直接用success

直接 xxx 就好了。

<% locals.success %>

<%- xxx %>

在Node.js中使用EJS模板引擎时,res.locals对象中的属性可以在EJS模板中直接访问。如果在layout.ejs中无法访问locals.success,可能是因为该属性没有正确设置或者模板渲染时没有传递正确的上下文。

以下是一些可能的原因及解决方案:

  1. 确保res.locals被正确设置: 确保在请求处理逻辑中正确设置了res.locals.success。示例如下:

    app.get('/some-route', (req, res) => {
        req.flash('success', '操作成功!');
        res.locals.success = req.flash('success');
        res.render('index', { title: '首页' });
    });
    
  2. 确保模板文件中正确引用了locals.success: 在EJS模板中直接使用locals.success即可。示例如下:

    <!-- layout.ejs -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title><%= title %></title>
    </head>
    <body>
        <h1><%= locals.success %></h1>
    </body>
    </html>
    
  3. 检查模板渲染顺序: 确保在调用res.render之前已经设置了res.locals。如果在渲染之后再设置,则无效。

  4. 确保Flash插件已正确安装并使用: 如果使用了connect-flash或其他类似插件,确保已正确配置并使用。

  5. 检查视图引擎配置: 确保在Express应用中正确配置了EJS作为视图引擎。示例如下:

    const express = require('express');
    const app = express();
    app.set('view engine', 'ejs');
    app.set('views', './views');
    
    // 其他中间件和路由配置
    

通过以上步骤,你应该能够在EJS模板中正确访问res.locals.success的值。如果问题仍然存在,请检查是否有其他地方覆盖或修改了该属性。

回到顶部