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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:06:48