You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:15:46