服务端连接本地MongoDB数据库方法及认证失败问题排查
关于服务器连接本地MongoDB的问题解答
1. 是否支持从服务器连接本地数据库进行读写操作
完全支持。只要网络链路连通、数据库侧放通对应访问权限、认证参数配置正确,服务端可以正常连接任意可达位置的MongoDB实例完成读写。
注意:你当前URI里写的localhost默认指向运行Node服务的机器本身,如果你的MongoDB部署在个人本地电脑、Node服务跑在远端云服务器上,这个地址从一开始就错了,需要改成MongoDB所在机器的公网/内网可访问IP,同时放通防火墙27017端口、修改MongoDB配置文件里的bindIp参数为0.0.0.0(或指定服务端IP),否则根本走不到认证步骤。
2. Authentication failed 报错排查修复方案
按优先级从高到低排查即可:
- 核对认证库配置
MongoDB账号是和数据库绑定的,如果你是在admin库下创建的账号,必须在连接URI里追加authSource=admin参数指定认证库,否则默认会去你连接的业务库my_db_name下校验账号,必然认证失败,修正后的URI格式如下:mongodb://user_name:my_password@localhost:27017/my_db_name?authSource=admin - 直接在MongoDB部署机器上用shell验证账号有效性
不要先猜代码问题,先在数据库所在机器执行以下命令,确认账号密码本身正确、权限配置正常:
如果shell登录失败,说明账号密码错误或者权限没配,直接在mongo shell里重新创建授权账号即可:# 如果账号建在业务库my_db_name下执行 mongo -u user_name -p my_password --authenticationDatabase my_db_name # 如果账号建在admin库下执行 mongo -u user_name -p my_password --authenticationDatabase adminuse my_db_name db.createUser({ user: "user_name", pwd: "my_password", roles: [ { role: "readWrite", db: "my_db_name" } ] }) - 检查特殊字符转义
如果你的账号、密码里包含@、:、/、?这类URI特殊字符,必须做URL编码后再写入连接串,比如密码里的@要转义为%40,否则会被识别为URI分隔符,导致实际传的账号密码和你预期的不一致。 - 兼容认证机制
如果是MongoDB 3.0以上版本,默认认证机制为SCRAM-SHA-1,部分升级后的实例可能存在认证机制不匹配的问题,可以在URI里追加authMechanism=SCRAM-SHA-1参数重试。
你贴的mongoose连接参数本身没有配置问题,不用在这部分浪费时间排查。
内容的提问来源于stack exchange,提问作者Sara Ree
相关产品推荐
相关产品推荐

