今天在thinkphp6框架里连接mongodb,报authentication fail错误,如下图所示:
网上查到的解决方法如下,但是对我无效:
//文件位置:/vendor/topthink/think-orm/src/db/connector/Mongo.php if (empty($config['dsn'])) { $config['dsn'] = 'mongodb://' . ($config['username'] ? "{$config['username']}" : '') . ($config['password'] ? ":{$config['password']}@" : '') . $config['hostname'] . ($config['hostport'] ? ":{$config['hostport']}" : ''); $config['dsn'] .= ($config['database'] ? "/{$config['database']}" : ''); //添加此行代码 }
修改之前打印出来的连接地址格式如下(非真实地址,仅供参考格式):
mongodb://test_admin:9YHrere#kdl@10.195.13.190:27017
按照上面修改,带上数据库名称,仍然无效:
mongodb://test_admin:9YHrere#kdl@10.195.13.190:27017/school
为了检验上面地址到底有没有问题,就打算本地先命令行连接试试。
结果我本地Windows安装的是Mongodb Server 6.0版本。
好巧不巧,此版本里不提供mongodb的客户端脚本(即mongo.exe),只有mongod.exe和mongos.exe。
所以需要我们另外下载客户端工具mongo shell,下载地址:mongo shell下载
安装好后,将上面连接地址输入,报的错误更加具体,立马就可以发现问题了:就是数据库连接密码中的特殊符号#导致的。
MongoParseError: Password contains unescaped characters
为了避免去改thinkphp框架底层代码,就只好去改密码了。
use admin; db.changeUserPassword("test_admin","123456789G");
改好后,就连接成功了。所以/vendor/topthink/think-orm/src/db/connector/Mongo.php这个文件的代码并没有问题哈。