I have an Express application working with MongoDB. I want to separate the database access from the server level. However, to get the result of a database call, I can only do one of two things:
Pass Res as an argument
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user', dbApi.getUsers(function (data) { res.send(data); })); ... //db-api.js ... getUsers: function (callback) { MongoClient.connect(url, function (err, db) { if (err) { throw err; } db.collection(collections.Users) .find({}) .toArray(function (error, documents) { db.close(); callback(documents); }); }); } ...
Suppose the req / res Express paradigm in db-api.js
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user', dbApi.getUsers); ... //db-api.js ... getUsers: function (req, res) { MongoClient.connect(url, function (err, db) { if (err) { throw err; } db.collection(collections.Users) .find({}) .toArray(function (error, documents) { db.close(); res.send(documents); }); }); } ...
However, I feel that both of these approaches add implicit dependencies that I would rather avoid. I would prefer to call dbApi independently in server.js so that it returns a result set that I can manipulate before returning, i.e.:
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user', function (req, res) { var result = dbApi.getUsers(); //do stuff with result as necessary res.send(result); }); ... //db-api.js getUsers: function () { MongoClient.connect(url, function (err, db) { if (err) { throw err; } db.collection(collections.Users) .find({}) .toArray(function (error, documents) { db.close(); return documents; }); }); }
But this last one, it seems, does not want to work, since documents do not return to the server level (the result is undefined). I know this because I am trying to do something synchronously, which is essentially asynchronous.
So, I guess what I'm looking for is tips for best practices regarding application architecture, as it relates to sharing data access level.