Nodejs 关于express 2.x 中app.dynamicHelpers怎么用在3.x中用res.locals取代?

Nodejs 关于express 2.x 中app.dynamicHelpers怎么用在3.x中用res.locals取代?

我是新手,就照着node.js权威指南书中敲得代码,epress3.x中app.dynamicHelpers已经被取消啦,百度了下说用res.locals方法,可我不知道怎么使用着个方法,页面报res no defined我的代码是这样的 在layout.ejs中如下来取值 <% if (res.locals.success) { %> <div class=“alert alert-success”> <%= success %> </div> <% } %> <% if (res.locals.error) { %> <div class=“alert alert-error”> <%= error %> </div> <% } %> 然后在index.js中以下代码用来传值 newUser.save(function(err) { if (err) { res.locals.error=error; return res.redirect(’/reg’); } req.session.user = newUser; res.locals.success=“注册成功”; res.redirect(’/’); }); }); 我也感觉这样代码有问题,可就是不知道怎么解决,求大神详细解答,我是新手,谢啦…


8 回复

当然可以。在Express 3.x版本中,app.dynamicHelpers 方法被移除,并推荐使用 res.locals 来替代。res.locals 是一个对象,用于存储模板中的局部变量。

示例代码

index.js 中设置 res.locals

首先,你需要确保在路由处理函数中正确地设置 res.locals。以下是修改后的代码示例:

var express = require('express');
var app = express();

app.use(express.urlencoded({ extended: false }));
app.use(express.json());

app.get('/reg', function(req, res) {
    // 渲染表单时,预设一些默认值(如果需要的话)
    res.locals.error = req.query.error || null;
    res.locals.success = req.query.success || null;

    res.render('register');  // 渲染表单视图
});

app.post('/reg', function(req, res) {
    var newUser = new User(req.body);  // 假设你有一个 User 模型

    newUser.save(function(err) {
        if (err) {
            // 如果保存失败,将错误信息添加到 res.locals
            res.locals.error = '注册失败';
            return res.redirect('/reg?error=true');
        }

        // 如果保存成功,将成功信息添加到 res.locals
        res.locals.success = '注册成功';
        req.session.user = newUser;
        res.redirect('/');
    });
});

app.listen(3000);

layout.ejs 中使用 res.locals

接下来,在你的 layout.ejs 文件中,你可以像这样访问 res.locals 中的属性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <% if (locals.error) { %>
        <div class="alert alert-error"><%= locals.error %></div>
    <% } %>

    <% if (locals.success) { %>
        <div class="alert alert-success"><%= locals.success %></div>
    <% } %>

    <!-- 其他内容 -->
    <%- body %>
</body>
</html>

解释

  1. 设置 res.locals

    • 在路由处理函数中,通过 res.locals 设置需要传递给模板的数据。
    • 例如,在用户注册失败时,设置 res.locals.error;注册成功时,设置 res.locals.success
  2. 访问 res.locals

    • 在 EJS 模板中,可以直接通过 <% if (locals.error) { %><% if (locals.success) { %> 来检查并显示相应的消息。
    • 使用 <%= locals.error %><%= locals.success %> 输出具体的错误或成功消息。

这种方法使得模板渲染更加清晰和易于管理。希望这能帮助你解决问题!


求大神解答啊???

res.locals.success is error , success is true.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

什么意思?不会又是利奥的助理吧?

我也在学这本书的例子,刚刚解决了这个问题: 在express3.0中要用req.flash()的话要安装connect-flash,直接npm install connect-flash安装,在app.js中加上: var flash = require(‘connect-flash’); app.use(flash()); app.use(function(req, res, next){ res.locals.user = req.session.user; var err = req.flash(‘error’); if(err.length) res.locals.error = err; else res.locals.error = null; var succ = req.flash(‘success’); if(succ.length) res.locals.success = succ; else res.locals.success = null;

next(); });

layout.ejs不用改,按书上的来就行。

需要一个中间件!+1

我按照你的方法来了,可还是报错 :500 ReferenceError: D:\nodejs\microblog\views\layout.ejs:32<br/> 30| <ul class=“nav”> <br/> 31| <li class=“active”><a href="/">首页</a></li> <br/> >> 32| <% if(!user){ %> <br/> 33| <li><a href="/login">登陆</a></li> <br/> 34| <li><a href="/reg">注册</a></li> <br/> 35| <% }else{ %> <br/><br/>user is not defined 服务器能运行,就是在页面上报错,把user相关除掉就报success not defined 或 error not difined?? 什么情况啊?

在Express 3.x版本中,app.dynamicHelpers被移除了,取而代之的是res.localsres.locals是一个对象,可以在请求处理的不同阶段设置属性,并且这些属性会被传递给视图引擎。

示例代码

在路由文件(例如 index.js)中:

var express = require('express');
var app = express();
var router = express.Router();

router.post('/register', function(req, res) {
    var newUser = {}; // 假设这里有一个新的用户对象
    newUser.save(function(err) {
        if (err) {
            // 错误时将错误信息存入 res.locals
            res.locals.error = '注册失败';
            return res.redirect('/reg');
        }
        // 成功时将成功信息存入 res.locals
        req.session.user = newUser;
        res.locals.success = '注册成功';
        res.redirect('/');
    });
});

// 使用路由中间件
app.use('/', router);

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

在布局文件(例如 layout.ejs)中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <% if (locals.error) { %>
        <div class="alert alert-error">
            <%= locals.error %>
        </div>
    <% } %>

    <% if (locals.success) { %>
        <div class="alert alert-success">
            <%= locals.success %>
        </div>
    <% } %>

    <%- body %>
</body>
</html>

解释

  1. 在路由文件中

    • 当用户注册成功或失败时,我们通过res.locals对象设置successerror属性。
    • 这些属性会自动传递到视图中。
  2. 在布局文件中

    • 使用<% if (locals.error) { %><% if (locals.success) { %> 来检查是否存在错误或成功信息。
    • 如果存在,它们会显示相应的提示信息。

注意点

  • 确保在渲染视图前正确设置了res.locals
  • 在EJS模板中,使用<%= locals.error %><%= locals.success %> 来访问这些属性。

这样可以避免res not defined的错误,并且能正确地向视图传递数据。

回到顶部