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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:03