Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Express.js View "globals"

I'm using Express.js (on Node.js) and I know that you can render a view with custom data via the "locals" parameter. (res.render("template", { locals: { foo: "bar" } });)

Is there any way to have "globals"? (ie. data that's accessible to every view)

I saw view options, but that isn't recursive, so it replaces the locals I set if I use any locals with my template.

This is my use case: I want to make it so that CSS/JS files can be added on a per-page basis, and that is part of my main layout. The problem is, if I don't explicitly set those arrays on every render, I get an undefined error, so in my template I always have to do the typeof css !== "undefined" dance. Additionally, I have other select box option lists that I don't want to have to explicitly add to each of my forms.

like image 411
Dominic Barnes Avatar asked Jan 17 '11 23:01

Dominic Barnes


People also ask

How do you access global variables in node JS?

Just because you use the word var at the top of your Node. js script does not mean the variable will be accessible by all objects you require such as your 'basic-logger' . To make something global just put the word global and a dot in front of the variable's name.

Can you explain globals in node JS?

Node. js global objects are global in nature and they are available in all modules. We do not need to include these objects in our application, rather we can use them directly. These objects are modules, functions, strings and object itself as explained below.

What are globals provided by node?

Node. js global objects are global in nature and available in all modules. You don't need to include these objects in your application; rather they can be used directly. These objects are modules, functions, strings and object etc. Some of these objects aren't actually in the global scope but in the module scope.

What is JavaScript Globals?

A global object is an object that always exists in the global scope. In JavaScript, there's always a global object defined. In a web browser, when scripts create global variables defined with the var keyword, they're created as members of the global object.


2 Answers

It's worth noting for those who may have come across this question since the release of Express 3, that the method 'dynamicHelpers' no longer exists.

Instead you can use the app.locals function, which acts as an object you can store values or functions in, and then makes them available to views. For example:-

// In your app.js etc. app.locals.title = "My App"; app.locals({     version: 3,     somefunction: function() {         return "function result";     } });  // Then in your templates (shown here using a jade template)  =title =version =somefunction()    // Will output  My App 3 function result 

If you need access to the request object to pull information from, you can write a simple middle-ware function and use the app.settings variable.

For example, if you are using connect-flash to provide messages to your users, you might do something like this:

app.use(function(req, res, next) {     app.set('error', req.flash('error'));     next(); }); 

Which would give you access to the error message with =settings.error in your template.

These topics are covered here, albeit slightly briefly: http://expressjs.com/api.html#app.locals

Update: Express 4

app.locals is now a simple JavaScript Object, so every property has to be set one by one.

app.locals.version = 3; app.locals.somefunction = function() {     return "function result"; } 

res.locals provides the exact same functionality, except it should be used for request-specific data rather than application-wide data. A user object or settings is a common use case.

res.locals.user = req.isAuthenticated() ? req.user : null; res.locals.userSettings = {     backgroundColor: 'fff' } 
like image 110
tigerFinch Avatar answered Oct 09 '22 07:10

tigerFinch


There is a way to have "global" variables for views, using dynamic view helpers.

From the Express.js guide:

app.dynamicHelpers(obj)

Registers dynamic view helpers. Dynamic view helpers are simply functions which accept req, res, and are evaluated against the Server instance before a view is rendered. The return value of this function becomes the local variable it is associated with.

app.dynamicHelpers({ session: function(req, res){ return req.session; } });

All views would now have session available so that session data can be accessed via session.name etc:

You can find a real example on how to use them here: https://github.com/alessioalex/Nodetuts/tree/master/express_samples (node app.js to start the app)

like image 31
alessioalex Avatar answered Oct 09 '22 07:10

alessioalex