MongoServerSelectionError: getaddrinfo ENOTFOUND 连接MongoDB Atlas报错求助
问题根因
MongoServerSelectionError: getaddrinfo ENOTFOUND cluster0.auifa.mongodb.net 属于域名解析失败,你的本地网络无法找到MongoDB Atlas集群对应的节点地址,和Keyv工具本身无关。
排查修复步骤
- 先验证域名解析状态:本地终端执行
nslookup cluster0.auifa.mongodb.net,如果返回解析失败,将本地DNS切换为公共DNS(如223.5.5.5、8.8.8.8)后重试 - 修正MongoDB连接串格式:你当前用的非SRV连接串格式错误,MongoDB Atlas集群的非SRV连接需要填写所有分片节点地址、端口、额外参数,不能直接写集群根域名。直接登录MongoDB Atlas控制台,在连接页选择Connect with MongoDB shell -> 选择对应版本后复制完整的非SRV连接串,替换你代码里的连接地址即可,不要手动拼接
- 如果你坚持用当前的短域名写法,必须确保连接串是SRV格式:
mongodb+srv://Discord:password@cluster0.auifa.mongodb.net/Cluster0?authSource=admin&replicaSet=Cluster0-shard-0&readPreference=primary&ssl=true,SRV模式默认就是27017端口且不需要写全节点地址,你之前加+srv没用大概率是没补全后面的必填参数。
代码隐藏bug修复
你当前的setGuildPrefix逻辑存在错误,即使解决连接问题也无法正常存储前缀:
// 原错误写法 if (!prefixMap) { prefixMap = "!"; // 这里把prefixMap赋值为字符串,后续无法写入msg.guild.id属性 } prefixMap[msg.guild.id] = prefix; await keyv.set('prefix', `${prefixMap}`); // 这里强制转字符串会把对象转成[object Object],数据完全丢失
修改为:
if (!prefixMap) { prefixMap = {}; // 初始化为对象才能存储多服务器的前缀映射 } prefixMap[msg.guild.id] = prefix; await keyv.set('prefix', prefixMap); // 不要转字符串,Keyv会自动序列化对象
另外注意dotenv.config()要放在所有读取环境变量的代码之前,如果你后续把数据库连接串、Bot Token放到.env文件,当前的加载顺序会导致读取不到环境变量。
内容的提问来源于stack exchange,提问作者Amrit R Asher
相关产品推荐
相关产品推荐

