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

Discord.js开发抽奖模块时获胜者返回undefined故障求助

问题原因

  • 错误调用不存在的Math.map方法:JavaScript标准Math对象没有map静态方法,该行执行会返回NaN,直接导致索引值异常
  • 错误读取用户集合长度:reaction.users.fetch()返回的是Discord.js专属的Collection类(类Map结构),不存在length属性,读取react.length得到的是undefined,和随机数运算后结果仍为NaN
  • 未过滤机器人自身反应:机器人主动给抽奖消息添加的🎉反应会被计入参与列表,可能出现抽中机器人的异常
  • 缺少无参与者的容错处理:如果没人参与抽奖,读取索引会继续报错

修复代码

你只需要替换setTimeout内的逻辑即可:

setTimeout(async function(){
  // 获取所有点了🎉的用户集合
  const react = await giveawaySent.reactions.cache.find(r => r.emoji.name === '🎉').users.fetch();
  // 过滤掉机器人用户,转为数组
  const participants = react.filter(user => !user.bot).array();
  // 无参与者容错
  if(!participants.length) {
    return message.channel.send(`抽奖【${title}】无人参与,已自动结束`);
  }
  // 生成合法随机索引
  let index = Math.floor(Math.random() * participants.length);
  let winner = participants[index];

  console.log(participants)
  console.log(index)
  console.log(winner)

  let winnerEmbed = new MessageEmbed()
  .setColor('GREEN')
  .setDescription(`Congratulations **${winner}** you won **${title}**`)
  message.reply({ embeds: [winnerEmbed] })
}, ms(time))

可选优化

你当前的奖品名称提取逻辑args.join(" ").slice(3)存在边界问题:如果时间参数长度超过3位(比如100s、10m),会切掉奖品名称的首字符,建议修改为:

const time = args[0];
const title = args.slice(1).join(" ");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:05