javascript - 使用 Node 管理 mongoDB 连接的正确方法是什么?

标签 javascript node.js mongodb database

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

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

我想也许可以创建某种连接功能 - 将您想要执行的操作(添加、更新、查找、删除)发送到何处(集合名称)以及它需要的任何内容。但我不能只包含这个函数,因为那样它就会向数据库泄露密码。那我能做什么呢?

谢谢!

最佳答案

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

<小时/>

Right now, for my test app, the connection to the db is in the main node file

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

<小时/>

Each page should connect to the db, find some data, and display it.

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

<小时/>

What I want/need: a secure way (i.e. not storing password on files users can access) to connect to the db just when needed.

我建议将您的应用程序配置(依赖于应用程序运行环境的任何变量)保存在一个单独的文件中,不要将其提交到 VCS。像 node-config 这样的模块可以在这方面提供很大帮助。

<小时/>

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

config/default.json:

{
  "mongo": null
}

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

config/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})
});

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

关于javascript - 使用 Node 管理 mongoDB 连接的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479199/

相关文章:

javascript - Angular UI-Router 在 url 更改时打开模式窗口

node.js - Socket.io如何检查客户端的cookie数据?

node.js - 无法使用 Vue + Express 保存 session

java - 我们如何通过 java 驱动程序查询嵌入式文档?

mongodb - 从 MongoDB 中的字段中获取子字符串

php - 单击正文关闭弹出窗口

javascript - 我如何能够复制(通过 Ctrl + C 或鼠标右键单击复制选项)在下拉列表中选择控制选项

php - Safari 6 ajax 请求获取新的 session ID

javascript(node.js) |在回调函数的范围内使用外部参数

javascript - 未捕获的 MongoError : unrecognized field 'allowDiskUsage'