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

添加多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导致,核心问题有两个:

  1. networkdb和game1db是回调风格的异步方法,外层try/catch无法捕获回调内部的错误,一旦回调里出现异常(比如interaction对象因超时被销毁、result未正确赋值),就会抛出未捕获的引用错误。
  2. 代码中使用了await wait(4000),但未定义wait函数,这会直接触发未定义错误,中断后续代码执行,间接引发interaction相关报错。

修复步骤

  1. 将回调风格的数据库查询方法封装为Promise,让try/catch能正常捕获异步错误。
  2. 补充wait函数的定义,确保延迟逻辑正常运行。
  3. 统一错误处理逻辑,简化重复代码,避免每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:54:13