Losing global variables when require is used

I am trying to globally define some things (underscore library, mongoose, db connection, eventually a permissions object)

app.js

/* module dependencies */
const express = require('express');
const auth = require('http-auth');
const underscore = require('underscore');
const expressValidator = require('express-validator');
const mongo = require('mongodb');
const db = require('./library/db');
/*end module dependencies */


/*routes files*/
const post = require('./routes/post');
/* end route files */


/* start the app instance */
var app = express();


/* authentication */
var basic = auth({
  authRealm : "Private area.",
  authList : ['Shi:many222', 'Lota:123456']
});
/* end authentication*/


/* pass app as an argument to the use method */
app.configure(function () {
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(expressValidator);
  app.use(db);
  //app.use(underscore);
  /* config debugging */
  app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  });
  /* production instance */
  app.configure('production', function(){
    app.use(express.errorHandler());
  });
  /* end config debugging */
});


/* start route management */
app.get('/post', function(req, res) {
  basic.apply(req, res, function(username) {
    post.use(app);
    post.findAll(req, res);
  });
});
app.get('/post/:id', function(req, res) {
  post.findById(req, res);
});


/* port management */
var port = 8000;
app.listen(port);
console.log('Listening: port: '+port);

post.js

    // Module dependencies
const underscore = require("underscore");


// placeholder for app instance
var app;


// add a use function to exports that we can access from our app
exports.use = function (appInstance) {
  // make app instance available in post.js
  app = appInstance;
};


/* find all rows */
exports.findAll = function(req, res) {
  console.log('Post:findAll');
  app.db.collection('Post', function(err, collection) {
    collection.find({},{limit: 100}).toArray(function(err, items) {
      res.send(exports.parseModels(items));
    });
  });
};


/* parse a single or all items passed to it for formatting */
exports.parseModels = function (items) {
  underscore.each(items, function(key, val) {
    console.log('underscore parsed an object');
  });
  return items;
};

db.js

var mongo = require('mongodb');

var Server = mongo.Server,
  Db = mongo.Db,
  BSON = mongo.BSONPure;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db = new Db('website', server);

db.open(function(err, db) {
  if(!err) {
    //do an error here
  }
});

exports.db = db;

I am having problem getting the DB in the correct scope, currently when a query is called inside post.js, I get this error:

    ost:findAll
TypeError: Cannot call method 'collection' of undefined
    at Object.exports.findAll (/Github/-api-v3/routes/post.js:19:10)
    at /Github/-api-v3/app.js:53:10
    at Basic.apply (/Github/-api-v3/node_modules/http-auth/lib/auth/basic.js:48:4)
    at /Github/-api-v3/app.js:51:9
    at callbacks (/Github/-api-v3/node_modules/express/lib/router/index.js:161:37)
    at param (/Github/-api-v3/node_modules/express/lib/router/index.js:135:11)
    at pass (/Github/-api-v3/node_modules/express/lib/router/index.js:142:5)
    at Router._dispatch (/Github/-api-v3/node_modules/express/lib/router/index.js:170:5)
    at Object.router (/Github/-api-v3/node_modules/express/lib/router/index.js:33:10)
    at next (/Github/-api-v3/node_modules/express/node_modules/connect/lib/proto.js:199:15)

Every module is run in a closure with its own scope. That means that any variables you define will only be accessible within that module. Any methods or variables that you want to make visible to the outside should be added to the module.exports object.

If you really have to define a global variable you need to add that as properties to the global object, but this is something that should be kept to an absolute minimum.

The proper way to do it is to require any depending modules within each and every module that you use. So you should do var _ = require("underscore"); in post.js if you want _ to reference to underscore.

If you need post.js to be aware of your app instance, you should pass it as an argument to a function that is available in the module.exports object for post.js.

post.js

// Module dependencies
const _ = require("underscore");

// placeholder for app instance
var app;

// add a use function to exports that 
// we can access from our app
exports.use = function (appInstance) {
    // make app instance available in post.js
    app = appInstance;
    // app.db is also accessible
}

// add the rest of the methods here

app.js

// Module dependencies
const express = require('express');
const auth = require('http-auth');
const _ = require('underscore');
const expressValidator = require('express-validator');
const post = require('./routes/post');

// create app instance
var app = express();

// require db into app.db
app.db = require("./db");

// pass app as an argument to the use method
post.use(app);

Note: I prefer to use const for dependencies to make it easier to distinct from ordinary variables/instances. Also note that exports is a shorthand for module.exports.