Discord.js开发中调用client.on时出现TypeError: client.on is not a function错误的求助
排查与解决:Discord机器人
TypeError: client.on 不是一个函数 错误 嘿,我来帮你搞定这个报错,问题主要出在事件绑定逻辑错误和参数/API版本不匹配上,咱们一步步拆解:
核心错误原因
错误的事件绑定时机 + 参数冲突
你这个模块是用来处理voiceStateUpdate事件的,但你却在run函数里又调用了client.on("voiceStateUpdate", ...),这相当于在事件触发的时候再去绑定一次事件,逻辑完全颠倒了。更关键的是,你的run函数参数写的是(message, client)——但voiceStateUpdate这类语音事件根本不会传递message对象,这个位置的client也不是真正的Discord Client实例,自然就没有on方法,直接触发报错。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
相关产品推荐
相关产品推荐

