如何跨 NodeJs 应用程序和模块正确重用与 Mongodb 的连接

2024-04-18

我一直在阅读和阅读,但仍然对跨整个 NodeJs 应用程序共享相同数据库 (MongoDb) 连接的最佳方式感到困惑。据我了解,连接应该在应用程序启动时打开并在模块之间重用。我目前认为最好的方法是server.js(一切开始的主文件)连接到数据库并创建传递给模块的对象变量。连接后,模块代码将根据需要使用此变量,并且此连接保持打开状态。例如。:

    var MongoClient = require('mongodb').MongoClient;
    var mongo = {}; // this is passed to modules and code

    MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) {
        if (!err) {
            console.log("We are connected");

            // these tables will be passed to modules as part of mongo object
            mongo.dbUsers = db.collection("users");
            mongo.dbDisciplines = db.collection("disciplines");

            console.log("aaa " + users.getAll()); // displays object and this can be used from inside modules

        } else
            console.log(err);
    });

    var users = new(require("./models/user"))(app, mongo);
    console.log("bbb " + users.getAll()); // not connected at the very first time so displays undefined

然后是另一个模块models/user看起来像这样:

Users = function(app, mongo) {

Users.prototype.addUser = function() {
    console.log("add user");
}

Users.prototype.getAll = function() {

    return "all users " + mongo.dbUsers;

    }
}

module.exports = Users;

现在我有一种可怕的感觉,这是错误的,那么这种方法是否有任何明显的问题,如果有的话如何改进?


您可以创建一个mongoUtil.js具有连接到 mongodb 并返回 mongodb 实例的功能的模块:

const MongoClient = require( 'mongodb' ).MongoClient;
const url = "mongodb://localhost:27017";

var _db;

module.exports = {

  connectToServer: function( callback ) {
    MongoClient.connect( url,  { useNewUrlParser: true }, function( err, client ) {
      _db  = client.db('test_db');
      return callback( err );
    } );
  },

  getDb: function() {
    return _db;
  }
};

要使用它,您可以在您的app.js:

var mongoUtil = require( 'mongoUtil' );

mongoUtil.connectToServer( function( err, client ) {
  if (err) console.log(err);
  // start the rest of your app here
} );

然后,当你需要在其他地方访问 mongo 时,比如在另一个地方.js文件,你可以这样做:

var mongoUtil = require( 'mongoUtil' );
var db = mongoUtil.getDb();

db.collection( 'users' ).find();

这样做的原因是在节点中,当模块required,它们只被加载/获取一次,所以你最终只会得到一个实例_db and mongoUtil.getDb()将始终返回相同的实例。

请注意,代码未经测试。

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

如何跨 NodeJs 应用程序和模块正确重用与 Mongodb 的连接 的相关文章

  • jQuery 绑定 ajax:成功无法在 Rails 3 应用程序中为新创建的(ajax)项目工作

    编辑这篇文章是因为我发现问题实际上在于rails无法绑定到ajax success函数 使用导轨3 2 3 感谢您花时间阅读并尝试提供帮助 我在 ajax success 删除项目上添加一个简单的淡出功能 如下所示 document rea
  • 超出最大调用堆栈大小 - Vue.js

    我有一个计算方法 可以让我计算产品的总价和折扣值 并希望获得以下值 总计 折扣 cartTotal var total 0 var discount Math round 0 1 this cartTotal 100 100 this ca
  • JavaScript 中的整数

    MDN https developer mozilla org en JavaScript A re introduction to JavaScript Numbers states JavaScript 中的数字是 双精度 64 位格式
  • 查找椭圆或贝塞尔曲线上的等距点

    目前我正在编写 JavaScript 代码 将对象放置在屏幕上的椭圆上 我试图找到能够解决这个问题之一的算法 椭圆将是完美的 但如果它太昂贵 贝塞尔曲线也可以 抱歉 但不幸的是我的数学不允许我使用我找到的答案 https mathoverf
  • 为什么这个标题图形不随世界更新

    对于以下内容 我很高兴组合框默认为世界 但当收音机被点击时 我也希望标题移回 世界 我该怎么做 我有这个笨蛋 http plnkr co edit 9FXJXVqLZLPFdDrmVJez p preview http plnkr co e
  • 使用 jQuery 的 $.get 和 GMail API 时出现 401(未经授权)错误

    我试图在用户使用 javascript 使用 G API 登录后运行 jQuery 的 get 但在浏览器控制台中收到 401 未经授权 错误 这是我请求的 url 的格式 https www googleapis com gmail v1
  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • 无法分配“导入类”,因为它是导入 - Javascript

    我一直在初始化一些常量类 export class A foo string b B export class B bar number 然后将它们导入另一个类并在另一个文件中初始化它们 但是 如果我想初始化 A 类时使用 B 类时遇到问题
  • 通过NVM为特定项目(文件夹)设置不同的节点版本

    我知道我可以通过以下方式更改节点版本nvm useCLI 命令 但是 我想为某个项目 文件夹 设置不同的特定节点版本 它已更改为nvm use命令但它恢复为default version每当我重新启动terminal or webstorm
  • Node.js 无限循环功能,在某些用户输入时退出

    我不太明白节点在异步和循环方面到底是如何工作的 我想在这里实现的是让控制台打印出来 Command 并等待用户的输入 但在等待时我希望它运行 一些随机函数 无休止地直到用户在终端上输入 exit 感谢所有的帮助 以及可能的解释 以便我能理解
  • 如何更改 localStorage 项中的单个值?

    我正在尝试更改本地存储中的值 此项是复选框的状态 我希望 每次选中复选框时都将该复选框的值设置为 true 或 false 我尝试了很多方法 直到我意识到不使用 JSON 就无法更改值 要添加我使用的值 localStorage setIt
  • javascript检测字符串是否只包含unicode表情符号[重复]

    这个问题在这里已经有答案了 我正在使用以下函数来替换字符串中的表情符号 并且效果很好 function doEmoji s var ranges ud83c udf00 udfff U 1F300 to U 1F3FF ud83d udc0
  • 使用 jQuery 获得第一堂课和最后一堂课

    可能是新手问题 我有这样的代码行 div class template active 我需要为自己准备每一堂课 我尝试了这段代码 this attr class 从该代码中我得到 模板处于活动状态 我需要的是一个带有 template 的字
  • 将 everyauth 与 Restify 结合使用

    我正在尝试使用 everyauth 来处理使用restify 创建的rest api 的身份验证 但却找不到起点 我希望做类似的事情 var restify require restify var everyauth require eve
  • 在固定位置元素上缩放 div 时丢失文本清晰度(模糊)(在移动 safari/webkit 浏览器上)

    附有重现代码 它 基本上 包含两个 div 元素 红色 固定 和黑色 带文本 单击黑色 div 时 它会放大 并且其上的文本保持清晰 然而 在 4 秒后 黑色 div 的 z index 发生了变化 黑色 div 变成了over红色分区 B
  • Soundcloud CORS

    正如我在文档中读到的那样 Soundcloud api 应该支持 cors http developers soundcloud com docs api guide crossdomain http developers soundclo
  • 如何在firebase云函数中添加时间戳

    我正在尝试添加Timestamp在有关 Firebase Cloud 功能的 Firestore 文档中 我曾尝试过firestore Timestamp fromDate new Date 但它不起作用 const functions r
  • 无法使用 Node npm 安装任何包

    我正在尝试通过 npm 安装一些节点包 但它不会安装 我已经尝试安装 卸载 更新节点 但似乎没有任何效果 我正在使用 ubuntu 12 04 以下是我尝试安装软件包的方式 npm install underscore npm http G
  • 如何导出从 HTML DOM 解析器检索到的所有图像?

    我想要 使用从我的网站获取所有图像PHP 简单 HTML DOM 解析器 http simplehtmldom sourceforge net 并将它们全部导出到我的桌面ALL立刻 Not右键单击保存或屏幕截图 OPTIONAL 保存所有h
  • jquery:卸载还是卸载之前?

    当用户从当前页面导航时 我想向服务器发布一条消息 我现在正在使用 unload 但结果不可靠 即使在其文档中也是如此 卸载事件的准确处理 各个版本都有所不同 浏览器 例如 某些版本 Firefox 的触发事件当 链接已被跟踪 但当 窗口已关

随机推荐

  • Octave-'endfunction' 命令与 'endif' 匹配

    有人可以告诉我我的代码有什么问题吗 sinlaw 150 30 39 8 parse error near line 30 of file endfunction command matched by endif function phi
  • 仅当应用程序 100% 完成时,才能在仪器测试后正确清理/拆卸

    我有一堆端到端仪器测试 依赖于 Espresso 它们启动我们的启动器活动 然后在我们的应用程序中导航 最终创建多个活动 在 的最后each测试我们的 After带注释的拆卸方法执行一些清理工作 我们遇到的问题是 测试完成 成功或失败的断言
  • Xcode 不断展开项目导航器中的所有组

    从几天前开始 Xcode 不断扩展项目导航器中的所有组和子组 我反复折叠它们 这样我就可以专注于我正在做的事情 然后我回去 它们都再次展开 还有其他人经历过吗 我折叠一个组 移至 Xcode 中的另一个选项卡 然后返回 所有组都再次展开 这
  • Lambda 属性值选择器作为参数

    我需要修改一个方法 以便它有一个额外的参数 该参数将采用 lambda 表达式 该表达式将用于内部对象以返回给定属性的值 请原谅我可能错误地使用了术语 因为这是我第一次尝试 LINQ 表达式 我尝试寻找答案 但正如我所提到的 我的术语似乎不
  • 使用 paramiko 检查远程主机上是否存在路径

    帕拉米科的SFTP客户端 http www metasnark com paramiko docs paramiko SFTP class html显然没有exists方法 这是我当前的实现 def rexists sftp path os
  • JavaFX - 在 DirectoryChooser 中显示文件

    是否可以使 DirectoryChooser 显示文件 而不仅仅是目录 与此处描述的问题相同JFileChooser 选择目录但显示文件 https stackoverflow com questions 2883447 jfilechoo
  • 在reactjs中添加内联样式而不使用JSX

    我正在尝试使用reactjs向元素添加内联样式 我发现 var divStyle color white backgroundImage url imgUrl ReactDOM render div Hello World div moun
  • twitter bootstrap 下拉菜单在应该关闭时没有切换

    天哪 我一直在为这件事抓狂 4个小时的下拉菜单 我正在使用 Twitter Bootstrap 顶部的固定导航有一个下拉菜单 非常标准的东西 只是下拉菜单没有像平常那样关闭 仅当按下切换按钮本身时 它才会打开和关闭 而不是按下菜单中的项目或
  • 在 Outlook 2007 C# 中获取安全发件人列表

    我已经在 C NET 4 0 中创建了 Outlook 2007 加载项 我想读取 C 代码中的安全发件人列表 if oBoxItem is Outlook MailItem Outlook MailItem miEmail Outlook
  • 如何防止c#中对象的实例化

    我需要的是检查传递给构造函数的参数 并防止特定对象的实例化 以防它们被视为无效 我发现可以抛出异常 因此对象引用将按预期以 null 结束 例如 仅当传递给构造函数的整数为非负数时 才会实例化此类 class MyClass public
  • Bootstrap 3 并排容器

    我正在尝试制作一个网页 其中内容的左半部分尊重引导程序 container最大宽度大小 而我的右侧可以一直到页面的末尾 作为 container fluid会工作 像这样的图片 到目前为止 我已经尝试了几种方法 目前我正在使用以下代码 di
  • 如何从 for 循环构建和填充 pandas 数据框? [复制]

    这个问题在这里已经有答案了 这是我正在运行的代码的一个简单示例 我希望将结果放入 pandas 数据帧中 除非有更好的选择 for p in game players passing print p p team p passing att
  • AAD 团体声称某些用户的 JWT 令牌缺失

    我在 AAD 上遇到一些奇怪的行为 用户成功登录后 我们的 API 调用中某些用户收到未经授权的消息 结果发现 JWT 中的声明丢失了 一些用户获得 groups 声明 他所属的所有 groupId 的数组 一些用户获得 hasgroups
  • 如何在命令行中查看 git 存储库中的所有标签[重复]

    这个问题在这里已经有答案了 有类似 git show标签 之类的东西吗 git tag列出存储库中使用的标签 git tag l如果你使用 l您可以通过选项传递搜索模式来过滤掉标签
  • 在 django 中通过变量模型名称访问模型

    我有两个相同的模型 比如说 django 中的 X 和 Y 如下所示 class X models Model con models CharField max length 100 a models ForeignField FOO cl
  • Node/Busboy:获取文件大小

    我使用 Busboy 模块通过下面的 CoffeeScript 代码来解析多部分请求 有时 问题出在 数据 处理程序上 该处理程序针对包含一个文件的请求多次调用 这意味着我需要对每个尺寸进行求和才能得出整个尺寸 此外 文件 处理程序中的文件
  • 如何在 Haskell 中创建通道列表(或数组),如 Go

    我试图将 Haskell 与 Go 进行比较以获得一些并发示例 以下代码是 Go 中使用 Goroutines 和通道的简单映射缩减示例 以下 Go 代码计算平方和 1 2 2 2 3 2 1024 2 为了测试Go和Haskell的性能
  • 网络适​​配器无法在 SQL Developer 中建立连接

    我使用包含 1000 个条目的 SQL 开发人员列表创建了一个数据库 并且创建成功 连接也成功了 但今天当我尝试连接时出现错误 IO Error The Network Adapter could not establish the con
  • 通过python3计算uniswap 3.0池(对)地址

    我遇到了一个关于如何计算的问题 新的 uniswap 版本 3 池 早期版本称为pair 地址基于1 https github com Uniswap v3 sdk blob aeb1b09 src utils computePoolAdd
  • 如何跨 NodeJs 应用程序和模块正确重用与 Mongodb 的连接

    我一直在阅读和阅读 但仍然对跨整个 NodeJs 应用程序共享相同数据库 MongoDb 连接的最佳方式感到困惑 据我了解 连接应该在应用程序启动时打开并在模块之间重用 我目前认为最好的方法是server js 一切开始的主文件 连接到数据