Discord.js创建GuildScheduledEvent报错求助:TypeError问题排查
Discord.js 创建定时事件触发 TypeError 问题排查与解决
Discord API 新增了 GuildScheduledEvent 功能,我尝试用 Discord.js 编写斜杠命令实现机器人创建定时事件,但 GuildScheduledEvent 和 GuildScheduledEventManager 无法正常工作,持续抛出如下 TypeError:
TypeError: Cannot read properties of undefined (reading 'options') at new CachedManager (C:\dev\Discord Bots\node_modules\discord.js\src\managers\CachedManager.js:21:64) at new GuildScheduledEventManager (C:\dev\Discord Bots\node_modules\discord.js\src\managers\GuildScheduledEventManager.js:17:5) at Object.execute (C:\dev\Discord Bots\better bot\bot-data\commands\cancel_film.js:11:31) at Client.<anonymous> (C:\dev\Discord Bots\better bot\main.js:44:17) at Client.emit (node:events:513:28) at InteractionCreateAction.handle (C:\dev\Discord Bots\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12) at module.exports [as INTERACTION_CREATE] (C:\dev\Discord Bots\node_modules\discord.js\src\client\websocket\handlers\INTERACTION_CREATE.js:4:36) at WebSocketManager.handlePacket (C:\dev\Discord Bots\node_modules\discord.js\src\client\websocket\WebSocketManager.js:354:31) at WebSocketManager.<anonymous> (C:\dev\Discord Bots\node_modules\discord.js\src\client\websocket\WebSocketManager.js:238:12) at WebSocketManager.emit (C:\dev\Discord Bots\node_modules\@vladfrangu\async_event_emitter\dist\index.js:282:31)
我知道错误发生位置,但不清楚原因,以下是我的斜杠命令代码:
const { SlashCommandBuilder, GuildScheduledEventManager, GuildScheduledEventPrivacyLevel, GuildScheduledEventEntityType } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('test_command') .setDescription('a test command') async execute(interaction) { const event_manager = new GuildScheduledEventManager('1039213773216546939') await event_manager.create({ name: 'Test Event', scheduledStartTime: new Date(1687284000000), privacyLevel: GuildScheduledEventPrivacyLevel.GuildOnly, entityType: GuildScheduledEventEntityType.Voice, description: 'This is a test Scheduled Event', channel: '1118952214774419569', image: null, reason: 'Testing with creating a Scheduled Event' }); } }
注:使用 Node.js 环境
问题原因及修复方案
错误根源
你直接通过 Guild ID 实例化 GuildScheduledEventManager 的方式不符合 Discord.js 的设计逻辑。GuildScheduledEventManager 属于 Guild 对象的附属管理器,不能单独用 ID 字符串初始化——它需要依赖客户端实例和完整的 Guild 对象才能正常加载内部配置,直接传 ID 会导致内部找不到 options 属性,触发报错。
另外代码还有两个小问题:
SlashCommandBuilder定义末尾缺少逗号,会引发语法错误create方法的channel参数需要传入 Channel 对象,而非 ID 字符串
修正后的代码
const { SlashCommandBuilder, GuildScheduledEventPrivacyLevel, GuildScheduledEventEntityType } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('test_command') .setDescription('a test command'), // 补上缺失的逗号 async execute(interaction) { // 限制命令仅在服务器内使用 if (!interaction.guild) { return interaction.reply('此命令仅支持在服务器内使用!'); } // 获取目标语音频道对象 const targetChannel = interaction.guild.channels.cache.get('1118952214774419569'); if (!targetChannel) { return interaction.reply('指定的语音频道不存在!'); } try { // 使用 Guild 自带的 scheduledEvents 管理器创建事件 await interaction.guild.scheduledEvents.create({ name: 'Test Event', scheduledStartTime: new Date(1687284000000), privacyLevel: GuildScheduledEventPrivacyLevel.GuildOnly, entityType: GuildScheduledEventEntityType.Voice, description: 'This is a test Scheduled Event', channel: targetChannel, reason: 'Testing with creating a Scheduled Event' }); await interaction.reply('定时事件创建成功!'); } catch (err) { console.error(err); await interaction.reply('创建定时事件失败,请查看控制台日志!'); } } }
额外注意事项
- 确保机器人拥有
ManageEvents服务器权限,否则无法创建定时事件 - 添加错误捕获逻辑可以快速定位创建失败的具体原因
内容的提问来源于stack exchange,提问作者user20471569
相关产品推荐
相关产品推荐

