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
相关产品推荐
相关产品推荐

