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

Discord.js v14选择菜单无法修改机器人状态问题求助

问题排查与修复方案

我帮你找到了问题所在,你的代码里有两个关键问题导致选择菜单无法修改机器人状态:

1. 多余的空格导致状态值无效

你的代码里通过forEach拼接statuses时,每个值后面都加了空格,比如选中dnd后,statuses会变成"dnd "(末尾带空格)。而Discord.js的client.user.setStatus()只接受纯状态字符串(online/idle/dnd/invisible),带空格的无效值会被忽略,自然无法修改状态。

而且你的选择菜单是单选(MinValues和MaxValues都设为1),完全不需要循环遍历interaction.values,直接取第一个值就可以拿到选中的状态。

2. 异步操作顺序与forEach的误用

你在forEach里使用了async,但forEach本身不支持异步等待,不过这里其实根本不需要异步操作。另外,你应该先调用deferReply避免交互超时,再执行状态修改操作,原代码的顺序可能导致潜在的超时问题。


修正后的interactionCreate.js代码

} else if (interaction.isSelectMenu()) {
  if (interaction.customId === "set-status") {
    // 单选菜单直接取第一个选中值
    const selectedStatus = interaction.values[0];
    try {
      // 先延迟回复,防止Discord判定交互超时
      await interaction.deferReply({ fetchReply: true });
      // 设置机器人状态
      await client.user.setStatus(selectedStatus);
      // 更新回复内容
      await interaction.editReply({ content: `Status: ${selectedStatus}` });
    } catch (error) {
      console.error('修改状态时出错:', error);
      await interaction.editReply({ content: '状态设置失败,请查看控制台日志。' });
    }
  }
}

修正说明

  • 移除了多余的forEach循环,直接通过interaction.values[0]获取选中状态,避免产生无效的带空格字符串。
  • 调整了异步操作顺序,先调用deferReply再处理状态修改,确保交互不会超时。
  • 添加了try-catch块,方便捕获和排查可能的错误(比如意外的权限问题或API异常)。

这样修改后,选择菜单就能正常修改机器人的在线状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:57:32