首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不确定如何处理Express / MongoDB应用程序中的数据访问对象/层

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

Stack Overflow用户
提问于 2015-04-14 09:26:35
回答 2查看 8.6K关注 0票数 8

我有一个运行在MongoDB上的Express应用程序。我想将我的数据库访问从服务器级别分离出来。然而,要获得数据库调用的结果,我似乎只能做以下两件事中的一件:

将Res作为参数进行传递

代码语言:javascript
复制
//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请求/res范例

代码语言:javascript
复制
//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,这样它就会返回一个我可以在返回之前操作的结果集,即:

代码语言:javascript
复制
//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;
    });
  });
}

但是最后一个似乎不需要工作,因为文档不会返回到服务器级别(结果未定义)。我知道这是因为我试图同步地做一些本质上是异步的事情。

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

EN

回答 2

Stack Overflow用户

发布于 2019-10-16 03:20:40

有点晚了,但在我看来,应该由Express处理程序处理HTTP请求,而您的另一个方法处理数据库。

展开原始脚本并使用回调:

代码语言:javascript
复制
//server.js
...
var dbApi = require('../data/db-api.js');
...
app.get('/api/user', (req, res) => {
  try {
    dbApi.getUsers((documents) => res.send(documents))
  } catch (error) {
    // or something along those lines
    res.status(500).send({ error: error.message });
  }
});
...

//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();
      if (error) {
        throw error;
      }
      return documents;
    });
  });
}

Sam H.也是对的,我会简化/异步这一点,这样会更直观,如果你不提供回调,node上的Mongodb客户端的当前版本将返回一个承诺:

代码语言:javascript
复制
//server.js
...
const dbApi = require('../data/db-api.js');
...
app.get('/api/user', async (req, res) => {
  try {
    const documents = await dbApi.getUsers();
    res.send(documents)
  } catch (error) {
    // or something along those lines
    res.status(500).send({ error: error.message });
  }
});
...

//db-api.js
...
getUsers: async function () {
  const db = await MongoClient.connect(url);
  const collection = await db.collection(collections.Users);
  const query = await collection.find({});
  const documents = await query.toArray();
  await db.close();
  return documents;
}

或者带着承诺:

代码语言:javascript
复制
//server.js
...
const dbApi = require('../data/db-api.js');
...
app.get('/api/user', (req, res) => {
  dbApi.getUsers()
    .then(documents => res.send(documents))
    .catch(error => res.status(500).send({ error: error.message })
});
...

//db-api.js
...
getUsers: function () {
  return MongoClient.connect(url)
    .then(db => Promise.all([
      db,
      db.collection(collections.Users).find({}).toArray()
    ]))
    .then(([db, documents]) => Promise.all([documents, db.close()])
    .then(([documents]) => documents)
}
票数 2
EN

Stack Overflow用户

发布于 2017-07-25 12:55:47

那么,您可以使用promisified version of the mongo client,返回该值的承诺,并使用async/await。例如,请参见this answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29617685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档