如何构建我的 Express 应用程序,只需要打开 mongodb 连接一次?

2023-12-26

注意:请在回答之前阅读这篇文章的编辑部分,它可能会节省您的时间并回答我的问题之一。

我遇到的问题非常简单,但我对整体来说还很陌生,并且在弄清楚如何在节点/express 应用程序中正确实现 mongodb 数据库连接时遇到问题。

我正在使用 Express 3.x,并且我的应用程序布局基于 Express 作者提供的这个项目:https://github.com/expressjs/express/tree/d8caf209e38a214cb90b11ed59fd15b717b3f9bc/examples/blog https://github.com/expressjs/express/tree/d8caf209e38a214cb90b11ed59fd15b717b3f9bc/examples/blog(现已从回购中删除)

我对创建博客没有兴趣,但是该应用程序的结构方式似乎相当不错。路线是分开的,一切都组织得很好。

我的问题是我可能有 5-6 个不同的路由 js 文件,每个路由 js 文件可能有 1 到 15 条路由;其中 1 或 15 条路线可能想要访问数据库。

所以我的问题是,每次我想查询数据库时都执行 db.open(...) 似乎是一个非常糟糕的主意。我应该提到,此时我正在使用本机 mongo-db 驱动程序(npm install mongodb)。

我还需要包含这样的文件:http://pastebin.com/VzFsPyax http://pastebin.com/VzFsPyax

...在所有这些路线文件和我的所有模型文件中。然后我还要处理数十个开放连接。

有没有一种方法可以让我只建立 1 个连接并在会话期间保持打开状态(每个请求都发出一个新的连接也很糟糕)?

如果是这样,我该怎么做?如果您知道答案,请使用 tj 的博客应用程序(本文前面链接的应用程序)结构作为基本指南发布代码示例。基本上有一种方法可以让路由和模型可以自由使用数据库,同时位于与数据库打开代码不同的文件中。

Thanks.

EDIT

我在解决我的一个问题上取得了一些进展。如果您查看 tj 的博客示例,他会在 app.js 中初始化其路由,如下所示:

require('./routes/site')(app);
require('./routes/post')(app);

在routes js文件中,它的开头是这样的:

module.exports = function(app){

今天早些时候我偶然发现了一个项目,我看到有人在 module.exports 调用 -> function(app, db) 中传递了 2 个变量。然后我想哇,有那么容易吗?我是否也需要将我的路线调整为(app,db)?是的,看来是这样。

现在问题的第 1 部分已经解决了。我不必在每个路由文件中都需要带有连接样板的 mongo.js 文件。同时它足够灵活,我可以决定选择哪些路由文件传递数据库引用。这是标准的,没有缺点吧?

但问题的第二部分(不幸的是重要的部分)仍然存在。

如何绕过我所做的每个查询都必须执行 db.open(...) ,并且理想情况下每个会话仅建立一次连接?


其他解决方案是通过请求将数据库传递给路由器,如下所示:

app.js

var db = openDatabase();

var app = express();

app.all('*', function(request, response, next)
    {
    request.database = db;
    next();
    });

app.get('/api/user/:id', Users.getByID);

users.js

var Users =
    {
    getByID: function(request, response)
        {
        request.database.collection('users').findOne(...)
        response.send(user);
        }
    };

module.exports = Users;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建我的 Express 应用程序,只需要打开 mongodb 连接一次? 的相关文章

随机推荐

  • codeigniter 3,文件上传给出 HTTP ERROR 500

    我是 CodeIgniter 3 框架的新手 所以我对这个错误有点了解 基本上 当我尝试上传图像时 它会抛出 HTTP ERROR 500 并且服务器上的错误日志中没有错误 这是控制器的功能 if POST config upload pa
  • 查全率与查准率图

    我正在尝试绘制精确度与召回率的图表 这是我的分类报告 我不知道如何绘制显示这些的图表 这是我的分类报告代码 from sklearn metrics import classification report print print Conf
  • Smalltalk 如何操作调用堆栈帧(thisContext)?

    Smalltalk 对象thisContext看起来奇怪又奇妙 我不明白它是什么以及它是如何工作的 甚至它如何实现延续 对于 C 的调用堆栈 我可以轻松想象它是如何实现和工作的 但对于这个 我不能 请帮助我理解它 我认为这不是一个简单的问题
  • GDB 中的 x86 标签和 LEA

    我正在学习用 x86 汇编 目前为 32 位 进行编码 并且正在努力完全理解内存模型 特别令人困惑的是标签的语义 LEA 指令以及可执行文件的布局 我编写了这个示例程序 以便我可以检查它在 gdb 中的运行情况 mem s SECTION
  • c# 检查文件是否打开

    我需要验证特定文件是否打开以防止复制该文件 我尝试了很多例子 但没有一个起作用 例如 我尝试这样做 protected virtual bool IsFileLocked FileInfo file FileStream stream nu
  • 如何在 Flutter 中像 Hamilton flutter 应用程序一样制作自定义 AppBar?

    像这样 https drive google com file d 1gbs1LAmEfD5NvPlUYlGrh2j9ZLv8ZFQu view usp sharing 我的方法 没有 AppBar 和 body 的脚手架 Stack gt
  • NodeJS 获取remoteAddress 使用的IP

    我有 3 个简单的 NodeJS 服务器 使用 NET HTTP 和 UDP 每个服务器都侦听端口 X 但有多个 IP 地址 我想在客户端连接到服务器时检索服务器的实际IP地址 客户端连接的IP 客户端必须写入才能连接到服务器的IP var
  • Facebook 登录后重定向活动

    我正在使用 Android Facebook SDK 4 01 通过 Facebook 登录我的应用程序 我的 MainActivity 的 facebook 登录成功 然后我使用 Intent 继续下一个活动 那部分有效 之后 在我的新活
  • valarrays 出现奇怪的 C++ 编译错误

    我在 C 中使用 valarrays 时遇到奇怪的编译错误 这是我的代码的精简版本 include
  • Spring MVC 既不是 BindingResult 也不是普通目标

    java lang IllegalStateException BindingResult 和 bean 名称 user 的普通目标对象都不能作为请求属性 所以当我尝试运行此网页时出现此错误 但我不知道为什么 我看到并阅读了很多有关此错误的
  • 检测是否有其他应用程序正在请求麦克风

    我在 SO 上看到了多个问题 这些问题说不可能看到另一个应用程序何时想要使用麦克风 当其他应用程序在 Android 中使用麦克风时 无法访问麦克风 https stackoverflow com questions 24170124 un
  • 如何修复 Android 上 Spongy Castle 的错误:找不到类 java.awt.datatransfer.DataFlavor

    我使用 lib Spongy Castle 在 Android 上对邮件进行签名和加密这个例子 https github com rtyley spongycastle blob spongy master scmail jdk15on s
  • 当多个用户从 asp 会员身份登录时,如何将用户名放入 sql 触发器中

    我正在尝试记录对数据库的所有更改 但无法找到将当前用户名获取到触发器的方法 我有triggerData存储用户信息的表 guid userid data username logintime 这些是在用户登录时插入的 这是触发器 decla
  • Apache HttpClient 添加字节范围标头?

    有谁知道如何在 HTTP 请求中请求字节范围 我希望通过请求下载停止位置的字节范围并从 getContent 读取其 InputStream 来促进应用程序中下载的恢复 我尝试迭代标题 但它们为空 来源如下 import java io I
  • 如何引用现有GeoJSON leaflet对象的数据?

    我们有一个 Leaflet Map 我们正在尝试使用 GeoJSON 构建它 我们的数据来自实时流 因此我们首先使用空数据初始化 GeoJSON var myLayer L geoJson style function feature va
  • 在 Aurelia 中,槽可以用于重复绑定吗?

    我想创建一个循环遍历数组并将其应用于数组中的每个项目的自定义元素 例如 自定义元素的视图模板将包含类似以下内容的内容 div div div div
  • 在 SSL 证书主题字段中添加 ID

    我想知道是否有一种简单的方法可以在创建 SSL 证书时自动生成 全局 唯一 ID 并将其添加到主题字段中 查看 OpenSSL bash 命令 示例将会很有帮助 something along the lines of this 首先 主题
  • 在 Jersey 1.18.1 请求过滤器中获取资源注释

    我正在实现一个用户授权模块 该模块将使用 新 注释应用于资源方法 为此 我创建了一个 Jersey 请求 过滤器 我需要在其中获取注释以允许 禁止资源操作 我正在使用 Dropwizard 0 7 1 和 Jersey 1 18 1 资源类
  • 如何在 UNIX 中创建新的环境变量......?

    如何在unix中创建新的环境变量并在程序中使用它 你可以知道你正在运行什么 shellps o comm p 我认为这或多或少是普遍的 所以 在 bash 和某些类似的 shell 中 如果您想为一次特定运行创建变量 您可以这样做 MYVA
  • 如何构建我的 Express 应用程序,只需要打开 mongodb 连接一次?

    注意 请在回答之前阅读这篇文章的编辑部分 它可能会节省您的时间并回答我的问题之一 我遇到的问题非常简单 但我对整体来说还很陌生 并且在弄清楚如何在节点 express 应用程序中正确实现 mongodb 数据库连接时遇到问题 我正在使用 E