不确定如何在Express / MongoDB应用程序中访问数据访问对象/层

我有一个运行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; }); }); } 

但是这最后一个似乎并不想工作,因为文档没有返回到服务器级别(结果是未定义的)。 我知道这是因为我试图做一些本质上是asynchronous的同步。

所以,我想,我正在寻找的是有关应用程序体系结构最佳实践的任何build议,因为它涉及到分离出数据访问层。

那么,你可以使用mongo客户端的promisified版本 ,返回该值的承诺,并使用async / await。 看,例如, 这个答案 。