JS开发的TCP服务器反脏话过滤器重复触发故障求助
故障根本原因
- 脏话列表遍历逻辑没有做终止控制:当前代码使用
forEach遍历所有敏感词,只要消息命中任意一个敏感词,就会执行一次全量的广播警告、计数、日志逻辑。如果一条消息命中多个敏感词(或者敏感词列表存在包含关系的词,比如同时存在「傻」和「傻逼」,用户发「傻逼」会同时命中两个词),就会触发多次警告逻辑,直接导致重复提示。 - 状态标识
sendable没有起到拦截作用:即使已经命中敏感词将sendable设为false,遍历逻辑仍会继续执行后续敏感词的匹配,只要再次命中仍会重复执行警告逻辑。
修复方案
直接将遍历方式换成支持提前终止的逻辑即可,推荐使用数组some()方法,只要命中第一个敏感词就终止遍历,避免重复执行:
//swear filter // 优化建议:敏感词列表读取可以放到服务启动阶段执行,不要每次收到消息都读本地文件 let slist = fs.readFileSync("./swearinglist.txt") let slist_array = slist.toString().split(","); let sendable = true; if (active) { // 使用some匹配,命中第一个敏感词就终止遍历,不会重复匹配 const hasSwear = slist_array.some((w) => data.includes(w)) if (hasSwear) { for (var i = 0; i < clients; i++) { if (sockets[i] === socket) continue; sockets[i].write(socket.remotePort + " Sollte sich erstmal beruhigen !\n") }; mistakes = mistakes + 1; console.log(socket.remotePort + " Wollte | " + data + " | in den chat schrieben !"); sendable = false } }
内容的提问来源于stack exchange,提问作者Blockzii
相关产品推荐
相关产品推荐

