基于mongodb模块的多数据库带账号密码远程连接求助
解决原生MongoDB模块连接带用户名密码的服务器数据库问题
不用换Mongoose完全可以搞定!我帮你梳理两种可行的方案,都是基于你现在用的mongodb原生模块来修改:
方案一:使用MongoClient连接字符串(推荐,更简洁现代)
现在mongodb模块官方更推荐用MongoClient替代旧的Server和Db构造函数,连接字符串的方式能直接把认证信息包含进去,写法更清晰。
修改你的db.js如下:
var mongodb = require('mongodb'); var MongoClient = mongodb.MongoClient; module.exports.init = function (callback) { // 替换成你的服务器数据库信息 const config = { username: '你的数据库用户名', password: '你的数据库密码', host: 'abc.com', port: 27017, authDb: 'admin' // 认证用的数据库,一般是admin;如果用户在业务库创建则改成user/employee }; // 转义用户名密码里的特殊字符(比如@、:),避免连接字符串解析出错 const escapedUser = encodeURIComponent(config.username); const escapedPass = encodeURIComponent(config.password); // 分别构建两个数据库的连接字符串 const userDbUrl = `mongodb://${escapedUser}:${escapedPass}@${config.host}:${config.port}/user?authSource=${config.authDb}`; const employeeDbUrl = `mongodb://${escapedUser}:${escapedPass}@${config.host}:${config.port}/employee?authSource=${config.authDb}`; // 先连接user数据库 MongoClient.connect(userDbUrl, { w: 1 }, function(error, client) { if (error) return callback(error); module.exports.user = client.db('user'); module.exports.user_tokens = module.exports.user.collection('tokens'); module.exports.user_session = module.exports.user.collection('session'); module.exports.user_consent = module.exports.user.collection('consent'); module.exports.user_client = module.exports.user.collection('client'); // 再连接employee数据库 MongoClient.connect(employeeDbUrl, { w: 1 }, function(error, client) { if (error) return callback(error); module.exports.employee = client.db('employee'); module.exports.employee_list = module.exports.employee.collection('list'); module.exports.employee_detail = module.exports.employee.collection('detail'); callback(null); // 两个数据库都连接成功后回调 }); }); };
方案二:基于你原来的旧API修改(兼容原有写法)
如果你想保留原来的Server和Db写法,只需要在数据库连接打开后加上认证步骤即可:
修改后的db.js:
var mongodb = require('mongodb'); module.exports.init = function (callback) { // 替换成你的服务器数据库信息 const username = '你的数据库用户名'; const password = '你的数据库密码'; var server = new mongodb.Server('abc.com', 27017, {}); module.exports.db = {}; // 连接user数据库并完成认证 new mongodb.Db('user', server, { w: 1 }).open(function(error, client) { if (error) return callback(error); // 执行认证,authSource指定认证数据库 client.authenticate(username, password, { authSource: 'admin' }, function(authErr) { if (authErr) return callback(authErr); module.exports.user = client; module.exports.user_tokens = client.collection('tokens'); module.exports.user_session = client.collection('session'); module.exports.user_consent = client.collection('consent'); module.exports.user_client = client.collection('client'); // 连接employee数据库并完成认证 new mongodb.Db('employee', server, { w: 1 }).open(function(error, client) { if (error) return callback(error); client.authenticate(username, password, { authSource: 'admin' }, function(authErr) { if (authErr) return callback(authErr); module.exports.employee = client; module.exports.employee_list = client.collection('list'); module.exports.employee_detail = client.collection('detail'); callback(null); }); }); }); }); };
几个关键注意事项
- 确保你的服务器MongoDB已经开启远程访问权限,防火墙放行27017端口
- 确认你创建的数据库用户拥有
user和employee这两个数据库的读写权限 - 如果你的用户是在业务数据库(比如user库)下创建的,记得把
authSource改成对应的数据库名称,而不是admin - 用户名或密码里如果包含
@、:这类特殊字符,方案一的encodeURIComponent会帮你自动转义,避免连接字符串解析错误
内容的提问来源于stack exchange,提问作者RSKMR
相关产品推荐
相关产品推荐

