在NodeJS - Express 4.0下使用app.dynamicHelpers发生错误:
app.dynamicHelpers({
^
TypeError: Object function (req, res, next) {
app.handle(req, res, next);
} has no method 'dynamicHelpers'
查阅资料发现新版本的Express已经不支持dynamicHelpers方法了。可以用locals来替代。
原来代码如下:
app.dynamicHelpers({ user: function(req, res) { return req.session.user; }, error: function(req, res) { var err = req.flash('error'); if (err.length) return err; else return null; }, success: function(req, res) { var succ = req.flash('success'); if (succ.length) return succ; else return null; } });
用locals方式替换为:
app.use(function(req,res,next){ res.locals.user=req.session.user;
var err = req.flash('error'); var success = req.flash('success');
res.locals.error = err.length ? err : null; res.locals.success = success.length ? success : null; next(); });
以上代码一定要放在指定路由的语句之前,不然页面中访问user、error、success变量会出错,提示:user is not defined。
注意:
req.flash 是 Express 提供的一个奇妙的工具,通过它保存的变量只会在用户当前
和下一次的请求中被访问,之后会被清除,通过它我们可以很方便地实现页面的通知
和错误信息显示功能。
所以如上代码如果修改成下面的写法,就无法在页面中正确显示出error和success的值。
app.use(function(req,res,next){ res.locals.user=req.session.user; res.locals.error = req.flash('error').length ? req.flash('error') : null; res.locals.success = req.flash('success').length ? req.flash('success') : null; next(); });
即是req.flash的值会在第一次访问之后会被清除。