Discord.js(v12.5.3)连接Mongoose(v5.11.14)数据库失败求助
解决Mongoose连接MongoDB Atlas时的认证失败问题
问题概述
使用discord.js v12.5.3开发Discord机器人,搭配mongoose v5.11.14连接MongoDB Atlas时,触发**MongoError: bad auth : Authentication failed**错误,相关错误日志及连接代码如下:
错误日志
The Bot has disconnected from the DB. C:\Users\utilizator\Desktop\discordbot\node_modules\mongodb\lib\cmap\connection.js:299 callback(new MongoError(document)); ^ MongoError: bad auth : Authentication failed. at MessageStream.messageHandler (C:\Users\utilizator\Desktop\discordbot\node_modules\mongodb\lib\cmap\connection.js:299:20) at MessageStream.emit (node:events:513:28) at processIncomingData (C:\Users\utilizator\Desktop\discordbot\node_modules\mongodb\lib\cmap\message_stream.js:144:12) at MessageStream._write (C:\Users\utilizator\Desktop\discordbot\node_modules\mongodb\lib\cmap\message_stream.js:42:5) at writeOrBuffer (node:internal/streams/writable:392:12) at _write (node:internal/streams/writable:333:10) at Writable.write (node:internal/streams/writable:337:10) at TLSSocket.ondata (node:internal/streams/readable:766:22) at TLSSocket.emit (node:events:513:28) at addChunk (node:internal/streams/readable:324:12) at readableAddChunk (node:internal/streams/readable:297:9) at Readable.push (node:internal/streams/readable:234:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { ok: 0, code: 8000, codeName: 'AtlasError' }
连接代码
const mongoose = require('mongoose'); require('dotenv').config(); module.exports = { init: () => { const dbOptions = { "useNewUrlParser": true, "useUnifiedTopology": true, "autoIndex": false, "poolSize": 5, "connectTimeoutMS": 10000, "family": 4 }; mongoose.connect(`mongodb+srv://denox:${process.env.PASS}@currencybotdb.tyfsmsg.mongodb.net/?retryWrites=true&w=majority`, dbOptions); mongoose.set('useFindAndModify', false); mongoose.Promise = global.Promise; mongoose.connection.on('connected', () => { console.log('The Bot has connected to the DB.'); }); mongoose.connection.on('disconnected', () => { console.log('The Bot has disconnected from the DB.'); }); mongoose.connection.on('err', (err) => { console.log('Error connecting to the DB:' + err); }); } }
解决方案
1. 验证数据库用户密码
- 登录MongoDB Atlas控制台,进入集群的Database Access页面
- 找到用户
denox,确认密码与.env文件中PASS的值完全一致(注意大小写、特殊字符,比如@、$等需正确输入,也可直接在Atlas中重置用户密码) - 若密码不匹配,修改
.env中的PASS为正确值
2. 检查IP白名单设置
- 在MongoDB Atlas控制台进入Network Access页面
- 确认当前服务器/本地IP已添加至白名单,或临时开启
Allow access from anywhere(仅测试用,不建议长期开启) - 若IP不在白名单,点击Add IP Address添加公网IP,或选择允许所有IP访问
3. 修正连接字符串格式
- 检查连接字符串中的密码部分:若密码包含
+、&、%等特殊字符,需进行URL编码(比如@替换为%40) - 确认集群地址
currencybotdb.tyfsmsg.mongodb.net是否正确,可在Atlas控制台Connect -> Connect your application中重新复制标准连接字符串
4. 调整Mongoose配置
- 尝试升级mongoose至5.x系列最新稳定版:
npm install mongoose@5.13.20,该版本与MongoDB Atlas认证机制兼容性更好 - 或在连接选项中添加
authSource: "admin"(部分场景需指定认证源):const dbOptions = { "useNewUrlParser": true, "useUnifiedTopology": true, "autoIndex": false, "poolSize": 5, "connectTimeoutMS": 10000, "family": 4, "authSource": "admin" };
5. 确认.env文件加载正常
- 在连接代码中临时添加日志,验证
process.env.PASS是否正确读取:console.log('DB Password:', process.env.PASS); // 测试用,注意不要提交到代码仓库 - 确保
.env文件位于项目根目录,文件名正确(不要写成.env.local等),文件内格式为PASS=你的数据库密码(不要加引号)
内容的提问来源于stack exchange,提问作者ren
相关产品推荐
相关产品推荐

