使用node管理与mongoDB的连接的正确方法是什么

What is the right way to manage connections to mongoDB, using node?

本文关键字:方法 是什么 连接 使用 管理 mongoDB node      更新时间:2023-09-26

我使用的是node.js和mongoDB。现在,对于我的测试应用程序,到数据库的连接在主节点文件中,但我认为这是一种错误的做法。我想要/需要的是:一种安全的方式(即不将密码存储在用户可以访问的文件上),以便在需要时连接到数据库。

例如:我想要几个管理页面(用户、组等)。每个页面都应该连接到数据库,找到一些数据并显示出来。它还有一个向数据库添加文档的表单和一个删除选项。

我想也许可以创建某种连接函数——将它发送到你想做的事情(添加、更新、查找、删除)、哪里(集合名称)以及它需要的任何东西。但我不能只包含这个函数,因为这样它就会显示数据库的密码。那么我该怎么办呢?

谢谢!

我会一点一点地回答你的问题。


现在,对于我的测试应用程序,到数据库的连接在主节点文件中

这很好,不过您可能希望将它放在一个单独的文件中以便于重用。NodeJS是一个持续运行的进程,因此理论上您可以使用与数据库的相同连接来提供所有HTTP响应。在实践中,您可能想要创建一个连接池,但NodeJS的Mongodb驱动程序已经自动完成了这项工作。


每个页面都应该连接到数据库,找到一些数据并显示出来

当您对MongoDB驱动程序发出查询时,只要您在应用程序启动时向其提供凭据,它就会自动使用其内部连接池中的连接。


我想要/需要的是:一种安全的方式(即不将密码存储在用户可以访问的文件上),以便在需要时连接到数据库。

我建议将您的应用程序配置(取决于应用程序运行环境的任何变量)保存在一个单独的文件中,而不提交给VCS。像node-config这样的模块可以在很大程度上帮助实现这一点。


使用节点配置,您最终得到的代码类似于:

config/default.json:

{
  "mongo": null
}

这是您提交的默认配置文件。

config/local.json:

{
  "mongo": "mongo://user:pass@host:port/db"
}

local.json应该被VCS忽略。里面有秘制酱汁。

connection.js:

var config = require('config');
var MongoClient = require('mongodb').MongoClient;
var cache;
module.exports = function(callback){
  if(cache){
    return callback(cache);
  }
  MongoClient.connect(config.get('mongo'), function(err, db){
    if(err){
      console.error(err.stack);
      process.exit(1);
    }
    cache = db;
    callback(db);
  });
}

关于如何处理重用数据库连接的不完整示例。请注意如何使用config.get(*)获取配置。实际的实现应该具有更健壮的错误处理,并防止建立多个连接。使用Promises会让这一切变得容易得多。

index.js:

var connect = require('./connection');
connect(function(db){
  db.find({whatever: true})
});

现在,您只需在任何地方要求您的数据库文件,并重复使用相同的数据库连接,该连接为您处理池,并且您的密码不会在任何地方硬编码。