我正在使用node.js和mongoDB。现在,对于我的测试应用程序,与数据库的连接是在主节点文件中,但我想这是一个错误的做法。 我想要/需要的是:一种安全的方式(即不存储用户可以访问的文件的密码),以便在需要时连接到数据库。
例如:我想要几个管理页面(用户,组等)。每个页面应连接到数据库,查找一些数据并显示它。它还有一个表单,用于向db添加文档和删除选项。
我想可能要创建某种连接功能 - 将它发送给你想要做的事(添加,更新,查找,删除),到哪里(集合名称)以及它需要什么。但是我不能只包含这个功能,因为它会向db显示密码。那我该怎么办?
谢谢!
答案 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})
});
现在您只需要在任何地方使用数据库文件,并重复使用相同的数据库连接,该连接可以为您处理池,并且您不会在任何地方对您的密码进行硬编码。