javascript – 不确定如何在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,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,documents) {
      db.close();
      return documents;
    });
  });
}

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

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

解决方法

好吧,你可以使用 promisified version of the mongo client,返回该值的承诺,并使用async / await.例如,参见 this answer.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)