I have an Express application running with MongoDB. I want to separate out my database access from the server level. However, to get the result of a database call I can only seem to 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);
});
});
}
...
Assume Express req/res 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 both of these approaches add implicit dependencies I would prefer to avoid. I would prefer to call dbApi independently in server.js such that it returns a result set 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 doesn't seem to want to work, as the documents aren't returned to the server level (result is undefined). I know this is because I'm trying to do something synchronously that is inherently asynchronous.
So, I suppose, what I'm looking for is any advice on best practices regarding app architecture as it pertains to separating out the data access layer.