Discord.js中判断题型Quiz命令触发Cannot read properties of undefined错误
解决Discord.js Quiz命令判断题型的TypeError问题
问题根源
错误 TypeError: Cannot read properties of undefined (reading 'question') 说明 randomQuestion 变量为undefined,核心原因是:
当你请求OpenTDB API获取判断题时,部分分类+难度+题型的组合没有足够(甚至没有)题目资源,导致返回的data.results是空数组。后续执行Math.floor(Math.random() * length)时,若length为0会生成NaN,最终data.results[random]无法取到有效数据。
解决方案
在处理API返回数据前,先校验请求状态和结果数组长度,避免访问undefined的属性:
- 检查OpenTDB的
response_code:API返回的response_code为0表示请求成功,非0值说明无结果或参数错误。 - 校验
data.results的长度,为空时直接提示用户更换选项。
修改后的关键代码片段:
const response = await fetch(`https://opentdb.com/api.php?amount=12&category=${category}&difficulty=${difficulty}&type=${type}`); const data = await response.json(); // 检查API请求状态 if (data.response_code !== 0) { return interaction.reply({ content: '无法获取题目,请检查分类、难度和题型的组合是否合理。', ephemeral: true }); } const length = data.results.length; // 检查是否有可用题目 if (length === 0) { return interaction.reply({ content: '该组合下没有可用题目,请更换选项重试。', ephemeral: true }); } const random = Math.floor(Math.random() * length); const randomQuestion = data.results[random]; console.log(randomQuestion); let question = randomQuestion.question; const correctAnswer = randomQuestion.correct_answer;
可选优化
判断题型的按钮标签应改为实际选项,提升用户体验:
const booleanAnswersRow = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('true') .setLabel('True') .setStyle(ButtonStyle.Primary), new ButtonBuilder() .setCustomId('false') .setLabel('False') .setStyle(ButtonStyle.Primary), new ButtonBuilder() .setCustomId('stop') .setLabel('Stop') .setStyle(ButtonStyle.Danger) );
内容的提问来源于stack exchange,提问作者Harsh Agrawal
相关产品推荐
相关产品推荐

