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

时间:2015-12-27 09:31:52

标签: javascript node.js mongodb database

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

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

我想可能要创建某种连接功能 - 将它发送给你想要做的事(添加,更新,查找,删除),到哪里(集合名称)以及它需要什么。但是我不能只包含这个功能,因为它会向db显示密码。那我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  

现在,对于我的测试应用程序,与db的连接位于主节点文件

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

  

每个页面都应连接到数据库,查找一些数据并显示它。

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

  

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

我建议将您的应用程序配置(依赖于运行应用程序的环境的任何变量)放在一个您不会提交给VCS的单独文件中。像node-config这样的模块可以帮助解决这个问题。

使用node-config最终会得到的代码如下:

<强>配置/ default.json:

{
  "mongo": null
}

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

<强>配置/ local.json:

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

您的VCS应忽略local.json。它含有秘制酱。

<强> 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})
});

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