Dinesh
Dinesh

Reputation: 4565

how to pass a shared variable to downstream modules?

I have a node toplevel myapp variable that contains some key application state - loggers, db handlers and some other data. The modules downstream in directory hierarchy need access to these data. How can I set up a key/value system in node to do that?

A highly upticked and accepted answer in Express: How to pass app-instance to routes from a different file? suggests using, in a lower level module

//in routes/index.js
var app = require("../app");

But this injects a hard-coded knowledge of the directory structure and file names which should be a bigger no-no jimho. Is there some other method, like something native in JavaScript? Nor do I relish the idea of declaring variables without var.

What is the node way of making a value available to objects created in lower scopes? (I am very much new to node and all-things-node aren't yet obvious to me)

Thanks a lot.

Upvotes: 0

Views: 251

Answers (4)

user949300
user949300

Reputation: 15729

Since using node global (docs here) seems to be the solution that OP used, thought I'd add it as an official answer to collect my valuable points.

I strongly suggest that you namespace your variables, so something like

global.myApp.logger = { info here }
global.myApp.db = {
   url: 'mongodb://localhost:27017/test',
   connectOptions : {}
}

If you are in app.js and just want to allow access to it

global.myApp = this;

As always, use globals with care...

Upvotes: 1

Dinesh
Dinesh

Reputation: 4565

I just created an empty module and installed it under node_modules as appglobals.js

// index.js
module.exports = {};
// package.json too is barebones
{ "name": "appGlobals" }

And then strut it around as without fearing refactoring in future:

var g = require("appglobals");
g.foo = "bar";

I wish it came built in as setter/getter, but the flexibility has to be admired.

(Now I only need to figure out how to package it for production)

Upvotes: 0

Brendan
Brendan

Reputation: 2935

One way to do this is in an anonymous function - i.e. instead of returning an object with module.exports, return a function that returns an appropriate value.

So, let's say we want to pass var1 down to our two modules, ./module1.js and ./module2.js. This is how the module code would look:

module.exports = function(var1) {
    return {
        doSomething: function() { return var1; }
    };
}

Then, we can call it like so:

var downstream = require('./module1')('This is var1');

Giving you exactly what you want.

Upvotes: 0

Dmitry Matveev
Dmitry Matveev

Reputation: 5376

This is not really related to node but rather general software architecture decisions.

When you have a client and a server module/packages/classes (call them whichever way you like) one way is to define routines on the server module that takes as arguments whichever state data your client keeps on the 'global' scope, completes its tasks and reports back to the client with results.

This way, it is perfectly decoupled and you have a strict control of what data goes where.

Hope this helps :)

Upvotes: 1

Related Questions