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

Discord.js机器人命令报undefined及Mongoose连接错误问题

问题根因定位与修复方案

所有异常均为Discord.js跨大版本不兼容+Mongoose 6+配置废弃+事件传参错误导致,对应修复如下:


1. Discord.js相关报错修复

涉及错误:

  • -balance命令抛出TypeError: Cannot read properties of undefined (reading 'send')
  • -clear 10命令抛出message.reply is not a function
  • -beg命令抛出TypeError: Cannot read properties of undefined (reading 'id')

以上三个错误的核心原因是代码没有拿到合法的Message实例,触发场景和修复步骤:

  • 版本适配问题:如果使用Discord.js v13及以上版本,首先要替换废弃事件、开启必填权限意图:
    1. 将旧版的message事件监听替换为messageCreate,v13+已完全移除message事件,用旧事件名无法拿到完整消息对象
    2. 初始化Client时必须开启对应Intents权限,否则拿到的消息对象是残缺的,无法访问内容、频道、发送者等属性:
    const { Client, GatewayIntentBits } = require('discord.js');
    const client = new Client({
      intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent, // v14必填,否则无法读取消息内容、获取完整消息实例
        GatewayIntentBits.GuildMembers
      ]
    });
    
  • 传参逻辑问题:检查messageCreate事件中调用命令的传参顺序,必须和命令文件中接收参数的顺序完全对齐,绝大多数undefined相关报错都是因为传参时把args、client等参数放在了message的位置,导致命令里拿到的第一个参数根本不是消息对象。正确的事件处理参考:
    const prefix = '-';
    client.on('messageCreate', message => {
      if (message.author.bot) return;
      if (!message.content.startsWith(prefix)) return;
      const args = message.content.slice(prefix.length).trim().split(/\s+/);
      const commandName = args.shift().toLowerCase();
      const command = client.commands.get(commandName);
      if (!command) return;
      // 注意传参顺序,第一个参数必须是完整的message对象
      command.execute(message, args).catch(console.error);
    });
    
  • 版本要求:Discord.js v14要求Node.js版本≥16.9.0,低版本Node.js无法正常加载依赖API,也会出现方法不存在的报错。

2. Mongoose相关报错修复

涉及错误:

  • 启动阶段抛出MongoParseError: option usefindandmodify is not supported
  • 后续触发MongooseError: Operation profilemodels.findOne() buffering timed out after 10000ms

错误根因:Mongoose 6.0及以上版本已经默认废弃并移除了useFindAndModify、useCreateIndex、useNewUrlParser、useUnifiedTopology四个旧配置项,连接数据库时仍然传入useFindAndModify: false这类配置,会直接触发Mongo解析错误,导致数据库连接失败,所有后续的数据库操作因为没有有效连接,会触发10秒缓冲超时。

修复步骤:

  • 删除mongoose.connect方法中所有上述废弃配置项,6.x+版本不需要手动传入这些参数,正确写法:
    const mongoose = require('mongoose');
    // 替换为你自己的MongoDB连接地址
    mongoose.connect('mongodb://127.0.0.1:27017/你的数据库名')
      .then(() => console.log('数据库连接成功'))
      .catch(err => console.error('数据库连接失败:', err));
    
  • 检查MongoDB服务状态:本地部署的Mongo确认服务已启动,使用Atlas云数据库的话检查IP白名单、账号密码、连接字符串是否正确,必须等数据库连接成功后再执行业务逻辑。

额外校验点

  • beg.js第11行的id读取报错,在修正上述传参顺序问题后即可解决:报错本质是代码中试图读取message.author.id,但因为传参错误拿到的不是合法message对象,author属性为undefined才会触发读id错误。
  • 执行-clear 10这类管理命令时,记得提前判断机器人自身是否拥有管理消息、发送消息的权限,避免权限不足导致的二次报错。

内容的提问来源于stack exchange,提问作者KazTeko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:12:24