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

Tho*_*ton 8 javascript architecture mongodb node.js express

我有一个运行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);
    });
  });
}
...
Run Code Online (Sandbox Code Playgroud)

假设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);
    });
  });
}
...
Run Code Online (Sandbox Code Playgroud)

但是,我觉得这两种方法都添加了我希望避免的隐式依赖.我宁愿在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;
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

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

所以,我想,我正在寻找的是关于应用程序架构的最佳实践的任何建议,因为它涉及分离数据访问层.

Sam*_* H. 1

那么,您可以使用mongo 客户端的承诺版本,返回该值的承诺,并使用 async/await。例如,请参阅此答案