Nodejs express视图助手dynamicHelpers和helpers从2.x到3.x改成什么了?
Nodejs express视图助手dynamicHelpers和helpers从2.x到3.x改成什么了?
是分离出去变中间件了,还是其他。找了一个早上,资源太匮乏了 app.dynamicHelpers() (use middleware + res.locals) 不明呀!!!! app.helpers() (use app.locals) 以验证
给个例子最好
在 Node.js 的 Express 框架中,从 Express 2.x 版本升级到 3.x 版本时,app.dynamicHelpers()
和 app.helpers()
方法被移除了,并且它们的功能被重新设计为使用中间件(middleware)来实现。
从 app.dynamicHelpers()
到中间件
在 Express 2.x 中,app.dynamicHelpers()
可以用来定义在渲染视图时可用的动态辅助函数。这些辅助函数会在每次请求处理时重新计算。在 Express 3.x 中,这种功能可以通过使用中间件和 res.locals
来实现。
示例代码:
const express = require('express');
const app = express();
// 使用中间件设置 res.locals
app.use((req, res, next) => {
res.locals.currentUser = req.user; // 假设你已经通过某种方式设置了 req.user
next();
});
// 视图引擎配置
app.set('views', './views');
app.set('view engine', 'ejs');
// 渲染视图时使用 res.locals 中的数据
app.get('/', (req, res) => {
res.render('index', { message: 'Hello World' });
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
从 app.helpers()
到中间件
在 Express 2.x 中,app.helpers()
可以用来定义全局辅助函数,这些函数可以在任何地方访问。在 Express 3.x 中,这种功能可以通过使用 app.locals
来实现。
示例代码:
const express = require('express');
const app = express();
// 设置全局变量
app.locals.someGlobalVar = 'This is a global variable';
// 视图引擎配置
app.set('views', './views');
app.set('view engine', 'ejs');
// 渲染视图时使用 app.locals 中的数据
app.get('/', (req, res) => {
res.render('index', { message: 'Hello World' });
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
中间件:在 Express 中,中间件是在请求到达路由之前或之后执行的一段代码。你可以使用中间件来设置一些全局变量,如用户信息 (
res.locals
) 或全局变量 (app.locals
)。 -
res.locals:这是一个对象,用于存储响应局部变量,这些变量可以在模板中访问。它类似于
app.locals
,但它的作用域仅限于当前请求。 -
app.locals:这是一个全局对象,可以存储在整个应用程序中都可以访问的变量。这类似于
app.helpers()
在 Express 2.x 中的作用。
通过这种方式,Express 3.x 移除了旧的 API,转而采用更灵活和强大的中间件系统来实现类似的功能。
自己顶下坐等答案
是啊,哪位大侠给个例子。
2.x:
app.helpers({
config: config,
title: config.title
});
app.dynamicHelpers({
//防止csrf攻击
csrf: function(req,res) {
return req.session ? req.session._csrf : '';
},
req: function(req,res) {
return req;
},
userInfo: function(req,res){
return req.session.user;
}
});
3.x
//app.helpers()
app.locals({
config: config,
title: config.title
});
//app.dynamicHelpers
app.use(function(req, res, next){
res.locals.title = config['title']
res.locals.csrf = req.session ? req.session._csrf : '';
res.locals.req = req;
res.locals.session = req.session;
next();
});
app.use(app.router);
3Q,也是刚在google的group的历史中找到!!!
请问您是怎么上google group的。我好想上不去。
我看的是个历史快照,哈哈
那您是如何操作的? 能发个图教我下吗?新手,请见谅啊。呵呵
翻、墙
res.locals.csrf = req.session ? req.session._csrf : ‘’;确定可以这样写?
res.locals.success=req.flash(“success”).lenght?req.flash(“success”):null; 无效
苍天呀!!!!length
res.locals.csrf = function(){if(){}else{}} 是否可行?
为啥不用 if(xxx)res.locals.csrf = '' else res.locals.csrf = ‘’
说实话还是不能理解为什么要把dynamicHelpers给删掉,哪怕有别的方式可以实现,也可以保留来达到结构清晰。
做了好多年js,最近在看node,还是觉得学习曲线有点陡峭。太小众了,资料少的可怜~~
其实仔细体味了下, 用middleware比dynamicHelpers强大和清晰多了。 毕竟node还没有1.0嘛。。。 以前学extjs的时候,那也好陡啊。 今天在看derby… 云里雾里的…
res.locals.success = req.success;这是怎么来的?你req里有success?
那success要怎么传过来呢
res.locals.success = 'success' ;
我现在改成这样,页面还是报success is not defined
书本的例子
app.dynamicHelpers({ user: function (request, response) { return request.session.user; }, error: function (request, response) { var err = request.flash(‘error’); if (err.length) return err; else return null; }, success: function (request, response) { var succ = request.flash(‘success’); if (succ.length) return succ; else return null; } }); 现在也不行了,3已经益处了这个API,搜索了一下,好像说用"everyauth" 但是我不知道要怎么使用,哎。。。express3之后,好多模块都改变了,苦逼啊。
这个express讲的非常不明白啊。
[http://jimpravetz.com/blog/2012/08/express-3-migration-issues/][1] 有解决方法,但我不想使用app.set [1]: http://jimpravetz.com/blog/2012/08/express-3-migration-issues/
(ejs) 发现了答案,使用locals.XXX就能取得res.locals.XXX= …中设定的值
app.set以后,在第三方的模块中怎么得到set的值?
这个3.x的,好用!
也遇到这个问题,谢谢分享!
现在版本的req.flash取了一次值之后就无效了。。所以req.flash(“success”).lengh?req.flash(“success”):null; 前面那个值是1,后面req.flash(“success”)已经变成null了。。。
我写的代码是这样的: app.locals({ inspect:function(obj){ return util.inspect(obj,true); } });
app.use(function(req,res,next){ res.locals.headers = req.headers; next(); }); app.get(’/helper’,function(req,res){ res.render(‘helper’,{title:‘Helpers’}); }); helper.ejs代码如下:<%= inspect(headers)%> 问什么访问总是报headers is not defined求指点这是怎么回事啊?
这个问题解决了没?我也遇到了同样的问题,搞了大半天了,还是没眉目,求指点。。。
在 Express.js 从 2.x 版本升级到 3.x 版本时,app.dynamicHelpers
和 app.helpers
方法被移除了。这些功能可以通过中间件和 res.locals
来实现。
解释
-
app.dynamicHelpers
: 在 Express 2.x 中,dynamicHelpers
允许你在每个请求中动态地设置视图中的变量。在 Express 3.x 及以后版本中,可以使用中间件和res.locals
来达到相同的效果。 -
app.helpers
: 这个方法用于设置全局的辅助函数。在 Express 3.x 及以后版本中,你可以直接将这些辅助函数挂在app.locals
上,这样它们就会成为全局可用的变量。
示例代码
动态助手 (dynamicHelpers
)
假设你想在每个视图中动态地传递当前时间:
Express 2.x
app.dynamicHelpers({
current_time: function(req, res) {
return new Date();
}
});
Express 3.x
app.use(function(req, res, next) {
res.locals.current_time = new Date();
next();
});
辅助函数 (helpers
)
假设你想定义一个全局的辅助函数来格式化日期:
Express 2.x
app.helpers({
formatDate: function(date) {
return date.toLocaleDateString();
}
});
Express 3.x
app.locals.formatDate = function(date) {
return date.toLocaleDateString();
};
然后在模板中你可以这样使用:
p Current Time: #{current_time}
p Formatted Date: #{formatDate(new Date())}
通过这种方式,你可以在 Express 3.x 中实现与 dynamicHelpers
和 helpers
类似的功能。