Mineflayer API服务器创建Bot时出现ECONNRESET错误求助
Mineflayer Bot 连接 ECONNRESET 错误排查与解决
先明确:ECONNRESET(错误码-104)本质是TCP连接被目标Minecraft服务器直接断开,结合你用Render免费套餐托管的场景,下面说具体原因和解决办法:
可能的触发原因
- Render免费套餐网络限制:免费实例的出站连接可能有次数/速率限制,或者目标服务器的防火墙、反作弊系统直接拦截了Render的IP段
- 连接参数处理不规范:从字符串分割出的
port是文本类型,直接传给Mineflayer可能导致解析错误;若目标服务器开启正版验证,离线模式的Bot会被直接拒绝 - 未监听Bot错误事件:你的代码没处理
bot的error事件,导致错误直接抛到控制台,虽程序未崩溃但会输出冗余报错 - 服务器端问题:目标MC服务器离线、版本与Mineflayer不兼容,或服务器设置了连接白名单未包含Bot来源IP
一步步解决
1. 修正连接参数与错误监听
把字符串类型的port转为数字,明确指定离线模式,同时新增错误和断开事件监听,避免无效实例占用内存:
case "create": let [username, ip, port] = data.split(","); let id = crypto.randomBytes(32).toString('hex'); // 将port转为数字,默认使用25565 let parsedPort = port ? parseInt(port, 10) : 25565; let bot = mineflayer.createBot({ username: username || `Bromine_${id.slice(0, 8)}`, host: ip, port: parsedPort, // 明确开启离线模式,避免版本兼容问题 offline: true }); // 捕获连接错误,清理无效Bot实例 bot.on("error", (err) => { console.error(`Bot ${id} 连接失败:`, err); delete bots[id]; // 若为Web请求触发,需返回错误响应 // response = {success: false, error: err.message}; }); // 连接断开时清理实例 bot.on("end", () => { console.log(`Bot ${id} 连接已断开`); delete bots[id]; }); bot.messages = []; bot.on("message", function(msg, pos) { this.messages.push({jsonMsg: msg, position: pos}) }); bots[id] = {bot: bot}; var response = {success: true, id: id}; break;
2. 规避Render网络限制
- 先测试连接公开的离线MC测试服,确认是否是目标服务器的问题
- 若目标服务器拦截Render IP,可更换服务器或尝试第三方代理服务(免费代理稳定性有限,自行权衡)
3. 核对版本兼容性
- 确保Mineflayer版本与目标MC服务器版本匹配,比如服务器为1.19.4,安装对应版本的Mineflayer:
npm install mineflayer@^4.14.0 - 检查目标服务器是否开启正版验证,若开启则离线模式Bot无法连接,需让服务器关闭验证或改用正版账号(若你坚持只支持离线模式,此条自行取舍)
4. 避免内存泄漏
每次Bot连接出错或断开后,务必从bots对象中删除对应条目,防止无效实例堆积占用内存。
内容的提问来源于stack exchange,提问作者The Empty String Photographer
相关产品推荐
相关产品推荐

