How can I structure my express app where I only need to open a mongodb connection once?

Other solution is to pass database to the router via request, like this:

app.js

var db = openDatabase();

var app = express();

app.all('*', function(request, response, next)
    {
    request.database = db;
    next();
    });

app.get('/api/user/:id', Users.getByID);

users.js

var Users =
    {
    getByID: function(request, response)
        {
        request.database.collection('users').findOne(...)
        response.send(user);
        }
    };

module.exports = Users;

I made a very simple module hub for this case that replaces the use of a global space.

In app.js you can create db connection once:

var hub = require('hub');
hub.db = new Db('foobar', new Server('10.0.2.15', 27017, {}), {native_parser: false});

And use it from any other files:

var hub = require('hub');
// hub.db - here link to db connection

This method uses a feature of 'require'. Module is only loaded for the first time and all the other calls gets a reference to an already loaded instance.

UPDATE

That's what I mean:

In main file like app.js we create Db connection, open it and store into hub:

app.js:

var hub = require('hub');
hub.mongodb = require('mongodb');
hub.mongodbClient = new hub.mongodb.Db('foobar', new hub.mongodb.Server('10.0.2.15', 27017, {}), {native_parser: false});
hub.mongodbClient.open(function(error) {
    console.log('opened');
});

Now in any other file (message for example) we have access to opened connection and can simple use it:

message.js:

var hub = require('hub');
var collection = new hub.mongodb.Collection(hub.mongodbClient, 'message');

module.exports.count = function(cb) {
    collection.count({}, function(err, count) {
        cb(err, count);
    });
};