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

Discord.js开发中调用client.on时出现TypeError: client.on is not a function错误的求助

排查与解决:Discord机器人 TypeError: client.on 不是一个函数 错误

嘿,我来帮你搞定这个报错,问题主要出在事件绑定逻辑错误和参数/API版本不匹配上,咱们一步步拆解:

核心错误原因

  1. 错误的事件绑定时机 + 参数冲突
    你这个模块是用来处理voiceStateUpdate事件的,但你却在run函数里又调用了client.on("voiceStateUpdate", ...),这相当于在事件触发的时候再去绑定一次事件,逻辑完全颠倒了。更关键的是,你的run函数参数写的是(message, client)——但voiceStateUpdate这类语音事件根本不会传递message对象,这个位置的client也不是真正的Discord Client实例,自然就没有on方法,直接触发报错。

  2. Discord.js版本API不匹配
    你写的(oldMember, newMember, newState)是Discord.js旧版本(v11及以前)的参数格式,新版本(v12+)的voiceStateUpdate事件只传递两个参数:oldState(旧语音状态)和newState(新语音状态),而且属性名也有变化(比如channelID改成了channel.id),这不仅会导致逻辑出错,还会让你拿到错误的对象。

修复后的代码

直接在run函数里处理语音状态变化的逻辑,不要再嵌套绑定事件,同时适配新版本Discord.js的API:

const Discord = require("discord.js");

module.exports = {
    name: "voiceStateUpdate",
    run: async (oldState, newState) => {
        // 获取触发事件的成员
        const member = newState.member || oldState.member;
        
        // 成员加入语音频道
        if (newState.channel && !oldState.channel) {
            if (newState.channel.id === "813346805357871154") {
                console.log("加入频道 %s (%s)", newState.channel.name, newState.channel.id);
            }
        } 
        // 成员离开语音频道
        else if (!newState.channel && oldState.channel) {
            console.log("离开频道 %s (%s)", oldState.channel.name, oldState.channel.id);
        } 
        // 成员切换语音频道
        else if (newState.channel && oldState.channel && oldState.channel.id !== newState.channel.id) {
            console.log(
                "离开频道 %s (%s) 并加入频道 %s (%s)", 
                oldState.channel.name, oldState.channel.id, 
                newState.channel.name, newState.channel.id
            );
        }
    },
};

额外注意事项

  • 确保你的Discord.js版本是稳定版(比如v14),可以通过npm list discord.js查看版本,版本差异会导致很多API不兼容。
  • 这个事件模块需要在你的主机器人文件中正确加载,比如主文件里可以这样写:
    const client = new Discord.Client({ intents: [/* 这里需要开启对应的意图,比如GuildVoiceStates */] });
    // 加载事件模块
    const voiceStateEvent = require("./path/to/your/event/file");
    client.on(voiceStateEvent.name, (...args) => voiceStateEvent.run(...args));
    
  • 别忘了开启机器人的GuildVoiceStates意图,否则机器人无法监听语音状态变化事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:13:16