添加多case到switch后出现ReferenceError: interaction is not defined的解决求助
问题
在switch语句中添加多个case后出现ReferenceError: interaction is not defined错误,单个case时功能正常。已通过const { game1db, networkdb} = require('../mysql/mysqlquery.js')引入MySQL查询方法,相关代码如下:
const run = async (client, interaction) => { if (!interaction.guild) return; let platform = interaction.options.get('platform').value let username = interaction.options.getString("username") console.log(platform) const hasRole = interaction.member.roles.cache.some(r => r.name === "Support") if (!hasRole) return; await interaction.deferReply({ ephemeral: true }); await wait(4000); switch (platform) { case "network": try { networkdb(`${username}`, (err, result) => { if (err) { interaction.followUp({ content: result, ephemeral: true }); } else { interaction.followUp({ content: result, ephemeral: true }); } }) } catch (error) { interaction.followUp({ content: `error: ${error}`, ephemeral: true }); } break; case "game1": try { game1db(`${username}`, (err, result) => { if (err) { interaction.followUp({ content: result, ephemeral: true }); } else { interaction.followUp({ content: result, ephemeral: true }); } }) } catch (error) { interaction.followUp({ content: `error: ${error}`, ephemeral: true }); } break; default: interaction.followUp({ content: `${platform} is not supported yet`, ephemeral: true }); } }
解决方案
问题根源
错误并非由多case的switch导致,核心问题有两个:
networkdb和game1db是回调风格的异步方法,外层try/catch无法捕获回调内部的错误,一旦回调里出现异常(比如interaction对象因超时被销毁、result未正确赋值),就会抛出未捕获的引用错误。- 代码中使用了
await wait(4000),但未定义wait函数,这会直接触发未定义错误,中断后续代码执行,间接引发interaction相关报错。
修复步骤
- 将回调风格的数据库查询方法封装为Promise,让
try/catch能正常捕获异步错误。 - 补充
wait函数的定义,确保延迟逻辑正常运行。 - 统一错误处理逻辑,简化重复代码,避免每个case单独写错误捕获。
修正后的代码
// 定义wait函数实现延迟功能 const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms)); const run = async (client, interaction) => { if (!interaction.guild) return; const platform = interaction.options.get('platform').value; const username = interaction.options.getString("username"); console.log(platform); const hasRole = interaction.member.roles.cache.some(r => r.name === "Support"); if (!hasRole) return; await interaction.deferReply({ ephemeral: true }); await wait(4000); // 工具函数:把回调风格的数据库方法转为Promise const queryWithPromise = (dbFunc, user) => { return new Promise((resolve, reject) => { dbFunc(user, (err, result) => { err ? reject(err) : resolve(result); }); }); }; try { let result; switch (platform) { case "network": result = await queryWithPromise(networkdb, username); break; case "game1": result = await queryWithPromise(game1db, username); break; default: await interaction.followUp({ content: `${platform} is not supported yet`, ephemeral: true }); return; } await interaction.followUp({ content: result, ephemeral: true }); } catch (error) { // 统一捕获所有错误,包括数据库查询和流程中的异常 await interaction.followUp({ content: `error: ${error.message}`, ephemeral: true }); } }
关键说明
- 用
queryWithPromise统一封装回调方法,让异步流程可以用await管理,同时外层try/catch能捕获所有异步错误。 - 修正了原代码中错误分支仍返回
result的逻辑问题(原代码err和正常分支都用result,实际错误时应返回错误信息)。 - 所有交互操作都添加
await,确保Discord API请求按顺序执行,避免因异步竞态导致interaction对象失效。
内容的提问来源于stack exchange,提问作者Mikael
相关产品推荐
相关产品推荐

