我正在使用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/