discord.js添加if-else语句后出现TypeError: fn is not a function错误求助
修复Discord.js验证模块的「TypeError: fn is not a function」错误
错误原因
核心问题出在if(message.member.roles.cache.some(notverified))这一行:some()方法要求传入一个判断函数,但你直接传入了角色对象notverified,JavaScript尝试把这个对象当作函数执行时,就会抛出fn is not a function的错误。
除此之外,代码还有两处小问题:
- else块中的
message.member.roles.add(role)里的role变量未定义 - 重复调用
message.delete()会导致异步操作冲突
修复方案
1. 修正some()的调用逻辑
将角色检查改为函数形式,推荐用角色ID判断(比名称更稳定,避免角色名称被修改导致逻辑失效):
// 正确的判断方式:传入函数检查角色ID if (message.member.roles.cache.some(role => role.id === notverified.id)) {
2. 删除无效的角色添加代码
else块中message.member.roles.add(role)属于无效代码,直接删除即可。
3. 优化消息处理逻辑
合并重复的消息删除操作,同时批量处理角色变更以减少API调用次数。
修复后完整代码
module.exports = { name: `verify`, description: "Verification part of bot", execute(client, message, args) { const { channel, member } = message; const verified = message.guild.roles.cache.find(r => r.name === "Verified"); const notverified = message.guild.roles.cache.find(r => r.name === "Not Verified"); const rolemember = message.guild.roles.cache.find(r => r.name === "Member"); // 检查用户是否拥有未验证角色 if (message.member.roles.cache.some(role => role.id === notverified.id)) { message.delete({ timeout: 100 }); // 批量移除/添加角色,提升效率并处理异常 message.member.roles.remove(notverified) .then(() => message.member.roles.add([verified, rolemember])) .catch(console.error); channel.send(`${member} 你已成功验证!`); } else { message.delete({ timeout: 1000 }); channel.send("你已经完成验证了!"); } } };
额外提示:
- 优先使用角色ID而非名称进行判断,避免服务器角色名称修改后功能失效
- 给角色操作添加
catch捕获异常,防止机器人因权限问题崩溃
内容的提问来源于stack exchange,提问作者Icebreaker
相关产品推荐
相关产品推荐

