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

Discord.JS v13 频道消息关键词搜索命令逻辑异常排查

问题排查结论

代码始终进入else分支的核心原因是判断逻辑写错:
messages.filter() 执行后返回的是Discord.js的Collection数据结构,哪怕没有匹配到任何符合条件的消息,这个Collection对象本身也是真值,因此!positive的判断永远不成立,逻辑永远走到else分支。

需修正的逻辑点
  • 不能直接判断filter返回的Collection对象是否为假,要通过Collection的size属性判断匹配到的消息数量,size === 0才代表没有匹配到任何封禁记录
  • 补充目标频道有效性校验:避免频道ID填错、机器人无频道访问权限时直接抛出未捕获错误
  • 匹配逻辑统一转小写处理:避免因消息内容、查询关键词的大小写差异导致漏匹配
  • 可按需调整fetch的limit参数:当前仅拉取频道最近30条消息,若封禁记录超过30条会出现漏判,需要全量检索可做分页拉取
修复后可运行代码
const Discord = require('discord.js');
const ms = require('ms');
const { Permissions } = require("discord.js");
const { MessageEmbed } = require("discord.js");

module.exports = {
    name: 'check',
    category: "Moderation",
    description: 'Checkt ob ein User gebannt ist',

    run: async(client,message,args,guild) => {
        const arg = message.content.split(" ")
        const banlist = client.channels.cache.get('替换为你的封禁频道实际ID')
        const check = arg[1]

        message.delete().catch(err => console.error(err));

        if (!check) {
            return message.channel.send({content :"Please specify a user to check!"})
                .then(msg => setTimeout(() => msg.delete(), 10000))
                .catch(err => console.error(err));
        }

        // 校验频道是否存在、是否为文本频道
        if (!banlist || !banlist.isText()) {
            return message.channel.send({content: "封禁记录频道配置异常,请联系管理员排查"})
                .then(msg => setTimeout(() => msg.delete(), 10000))
                .catch(err => console.error(err));
        }

        banlist.messages.fetch({limit : 100}).then(messages => {
            // 统一转小写做不区分大小写的匹配
            const positive = messages.filter(msgs => msgs.content.toLowerCase().includes(check.toLowerCase()))
            if(positive.size === 0) {
                message.channel.send({content :"This user is not banned!"})
                    .then(msg => setTimeout(() => msg.delete(), 10000))
                    .catch(err => console.error(err)); 
            }
            else {
                message.channel.send({content :`This user is banned.`})
                    .then(msg => setTimeout(() => msg.delete(), 10000))
                    .catch(err => console.error(err)); 
            }
        }).catch(err => {
            console.error("拉取封禁记录失败:", err);
            message.channel.send({content: "拉取封禁记录失败,请检查机器人权限"})
                .then(msg => setTimeout(() => msg.delete(), 10000))
                .catch(e => console.error(e));
        })
    }
};

注:代码中将拉取消息的上限调整到了100条,可根据你的服务器实际封禁记录数量自行修改数值,如果需要检索更早的历史消息,需要额外实现消息分页拉取逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:39:20