【发布时间】:2015-06-19 11:50:01
【问题描述】:
我有一个运行 MongoDB 的 Express 应用程序。我想将我的数据库访问与服务器级别分开。但是,要获得数据库调用的结果,我似乎只能做以下两件事之一:
将 Res 作为参数传递
//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);
});
});
}
...
在 db-api.js 中假设 Express req/res 范式
//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);
});
});
}
...
但是,我觉得这两种方法都添加了我希望避免的隐式依赖项。我宁愿在 server.js 中独立调用 dbApi,以便它返回一个我可以在返回之前操作的结果集,即:
//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;
});
});
}
但是最后一个似乎不想工作,因为文档没有返回到服务器级别(结果未定义)。我知道这是因为我试图同步地做一些本质上是异步的事情。
所以,我想,我正在寻找有关应用架构最佳实践的任何建议,因为它与分离数据访问层有关。
【问题讨论】:
标签: javascript node.js mongodb express architecture