Updated Express.js from version 2 to 3, and the following call to app.dynamicHelpers({..})
broke as it is no longer present in V3:
app.dynamicHelpers({
request: function(req){
return req
},
...etc.
});
There's a migration guide which says this:
app.dynamicHelpers()
(use middleware + res.locals)But I'm stumped how to do that. Is there a more concrete example of how to migrate that?
Related SO post: nodejs express 3.0
I had the same problem with session.user and just fixed it by understanding that the app.use function needs to be IN the configure part, not where it was before.
Before:
app.configure();
app.dynamicHelpers({
user: function(req, res) {
return req.session.user;
}
});
After:
app.configure(function(){
//...
app.use(function(req, res, next){
res.locals.user = req.session.user;
next();
});
//...
});
for Flash have a look at connect-flash
The solution with 16 votes is correct but be sure to use the res.locals
assignment before
app.use(app.router);
refer to this post http://stackoverflow.com/a/12597730/1132109
reponse.locals.use is a new useful feature of Express that lets you send a variable to your model that first needs to be evaluated. Say, for example, you want to send 3 variables to your view, all of which have to come after a request to a mongodb. The "old" way was to nest 3 callbacks, and when the last one returned you would render your view. locals.use makes this a heck of a lot easier as it will evaluate your functions and will render your view only when all have been evaluated.
Here's a short snippet of code on how to use them (this is coffee-script, hopefully you can convert it to javascript :D)
response.locals.use (request, response, done) ->
myAsynchMethod (value) ->
reponse.locals.myProperty = value
done()
In this case, there will be a variable named myProperty you can use on your view that has it's value set to whatever myAsynchMethod gave the callback.
Have a look at the examples folder at github. For example auth:
app.use(function(req, res, next){
var err = req.session.error,
msg = req.session.success;
delete req.session.error;
delete req.session.success;
res.locals.message = '';
if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
next();
});
You can then use the variable "message" in your template.