从文本文件提取命中敏感词实现消息自动过滤功能异常问题咨询
问题修复方案
核心问题根因
- 敏感词读取分割后没有做空白过滤:用
split("\n")分割文件内容后,若文件存在末尾空行、每行首尾残留空格,会产生空字符串元素。任意字符串调用includes('')都会返回true,会直接导致所有敏感词都被判定为命中,出现全量推送的问题。 - 匹配逻辑重复且大小写规则不一致:筛选
blocked数组时你将消息内容转小写做匹配,后续遍历blocked时又用原始大小写的消息内容做二次校验,既冗余又容易出现大小写不匹配的漏判。 - 重复执行操作:遍历
blocked数组时每遍历一个敏感词就执行一次消息删除、一次通知发送,会触发重复删消息报错、重复推送通知的问题。
修复后代码
const fs = require('fs'); // 读取敏感词并做预处理:修剪空白、过滤空行 const badwords = fs.readFileSync("./badwords.txt","utf8") .toLowerCase() .split("\n") .map(word => word.trim()) .filter(word => word); // 过滤空字符串 // 匹配得到所有命中的敏感词 const blocked = badwords.filter(word => message.content.toLowerCase().includes(word)); if (blocked.length) { // 仅命中时执行操作,加错误捕获避免删除已失效消息报错 message.delete().catch(err => console.error('消息删除失败:', err)); // 一次性拼接所有命中敏感词发送通知 log_channel.send(`消息已删除,命中敏感词:${blocked.join('、')}`); }
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

