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(’/’); }); }); 我也感觉这样代码有问题,可就是不知道怎么解决,求大神详细解答,我是新手,谢啦…
当然可以。在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>
解释
-
设置
res.locals
:- 在路由处理函数中,通过
res.locals
设置需要传递给模板的数据。 - 例如,在用户注册失败时,设置
res.locals.error
;注册成功时,设置res.locals.success
。
- 在路由处理函数中,通过
-
访问
res.locals
:- 在 EJS 模板中,可以直接通过
<% if (locals.error) { %>
和<% if (locals.success) { %>
来检查并显示相应的消息。 - 使用
<%= locals.error %>
和<%= locals.success %>
输出具体的错误或成功消息。
- 在 EJS 模板中,可以直接通过
这种方法使得模板渲染更加清晰和易于管理。希望这能帮助你解决问题!
求大神解答啊???
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.locals
。res.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>
解释
-
在路由文件中:
- 当用户注册成功或失败时,我们通过
res.locals
对象设置success
或error
属性。 - 这些属性会自动传递到视图中。
- 当用户注册成功或失败时,我们通过
-
在布局文件中:
- 使用
<% if (locals.error) { %>
和<% if (locals.success) { %>
来检查是否存在错误或成功信息。 - 如果存在,它们会显示相应的提示信息。
- 使用
注意点
- 确保在渲染视图前正确设置了
res.locals
。 - 在EJS模板中,使用
<%= locals.error %>
或<%= locals.success %>
来访问这些属性。
这样可以避免res not defined
的错误,并且能正确地向视图传递数据。