Mongoose无法连接本地MongoDB数据库提示认证失败如何解决
问题背景
- 最初使用MongoDB Atlas控制台「connect application」生成的URI连接数据库失败
- 后续搭建本地MongoDB服务,完成下载、全流程配置,创建了
data/db目录,通过MongoDB Compass输入本地连接地址可以正常访问空数据库 - 编写Mongoose连接代码运行后,无法连接数据库,抛出如下错误:
MongoServerError: bad auth : Authentication failed. at MessageStream.messageHandler (D:\tests\node_modules\mongodb\lib\cmap\connection.js:467:30) at MessageStream.emit (node:events:527:28) at processIncomingData (D:\tests\node_modules\mongodb\lib\cmap\message_stream.js:108:16) at MessageStream._write (D:\tests\node_modules\mongodb\lib\cmap\message_stream.js:28:9) at writeOrBuffer (node:internal/streams/writable:389:12) at _write (node:internal/streams/writable:330:10) at MessageStream.Writable.write (node:internal/streams/writable:334:10) at TLSSocket.ondata (node:internal/streams/readable:754:22) at TLSSocket.emit (node:events:527:28) at addChunk (node:internal/streams/readable:315:12) { ok: 0, code: 8000, codeName: 'AtlasError' }
- 报错对应的业务代码如下:
const express = require('express'); const mongoose = require('mongoose'); const CPD = require("./database/log"); // express初始化 const app = express(); // 数据库连接配置 const dbURI = 'mongodb://localhost:27017/local' mongoose.connect(dbURI).then((res) => console.log("success")).catch((err) => console.log(err)) // 服务路由配置 app.get('/', (req, res) => { res.send('Welcome!') }) app.listen(3000);
问题根因
报错信息中明确携带codeName: 'AtlasError'标识,说明当前Mongoose的连接请求根本没有发送到本地MongoDB服务,仍然在尝试连接之前配置过的MongoDB Atlas远程集群,常见诱因有三个:
- 修改代码后没有重启Node进程,运行的还是之前填写Atlas连接地址的旧版本代码
- Mongoose默认会优先读取运行环境中
MONGODB_URI变量的值作为连接地址,之前配置Atlas连接时大概率在系统环境变量或者项目.env文件中残留了Atlas的连接串,直接覆盖了代码里硬编码的本地URI - 本地27017端口被其他程序占用,启动的本地mongod服务实际没有运行在27017端口,连接请求被异常路由到了之前的Atlas连接逻辑
排查解决步骤
按顺序操作即可定位解决:
- 停掉当前运行的Node服务,确认代码里的
dbURI确实是mongodb://localhost:27017/local,保存文件后重新启动服务,先排除旧代码缓存问题。 - 打开命令行执行
netstat -ano | findstr "27017",查询27017端口对应的进程ID,在任务管理器中确认该进程是本地启动的mongod.exe,而非其他程序。如果端口被其他程序占用,要么关闭占用程序,要么启动本地MongoDB时指定其他端口,同步修改代码里的连接端口即可。 - 检查系统环境变量、项目根目录的
.env文件,删除所有值为Atlas连接串的MONGODB_URI配置项,避免默认配置覆盖代码里硬编码的连接地址。 - 如果手动给本地MongoDB开启了认证,需要在URI中携带用户名密码,格式为
mongodb://[用户名]:[密码]@localhost:27017/local;刚完成安装的默认本地MongoDB不会开启认证,使用无账号密码的连接串即可正常连接。
快速验证技巧:把代码里的dbURI改成
mongodb://localhost:27018/test(一个确定没有运行MongoDB服务的端口)再运行,如果还是抛出Atlas认证错误,就可以确定是环境变量或者旧代码缓存的问题,和本地MongoDB的配置、data/db目录权限等无关,不需要反复重装MongoDB。
内容的提问来源于stack exchange,提问作者caustic9999
相关产品推荐
相关产品推荐

