discord.js 12.5.3 环境下移除消息用户提及(@)的问题求助
Discord.js v12.5.3 移除消息用户提及修复方案
原代码核心问题
- JavaScript字符串的
replace方法为不可变操作,仅返回替换后的新字符串,不会修改原变量。原有代码中content.replace(``, '')既没有指定要匹配的提及内容,也没有接收返回值,因此无任何效果。 - Discord用户提及的标准格式为
<@用户ID>(无昵称格式)或<@!用户ID>(带昵称格式),需要匹配该格式才能完成替换。 form变量仅在if分支中声明,当无用户提及进入else分支时,form变量未定义,执行message.channel.send(form)会抛出报错。- 单独书写的
!message.content.trim().endsWith('-test');无任何业务逻辑作用,属于无效代码。
修复后完整代码
// 预处理内容:转小写、截断前6位、移除首尾空格、替换everyone和here防全员艾特 var content = message.content.toLowerCase().slice(6).trim() .replace(/@(everyone)/gi, "@evеryone") .replace(/@(here)/gi, "@hеre"); // 批量移除所有用户提及 if (message.mentions.users.size) { message.mentions.users.forEach(user => { // 构建匹配当前用户所有提及格式的正则,全局替换 const mentionReg = new RegExp(`<@!?${user.id}>`, 'g'); content = content.replace(mentionReg, ''); }); // 如需要保留原if分支的其他逻辑可在此处添加 } else { doSomething() } // 移除替换后产生的多余空格 content = content.trim(); // 若需要处理原有的-test判断逻辑可在此处添加 // if (message.content.trim().endsWith('-test')) { // 对应逻辑 // } // 发送处理后的内容,兜底处理空内容避免报错 message.channel.send(content || '处理后内容为空');
关键修改说明
- 替换时将返回值重新赋值给
content变量,保证修改生效。 - 匹配Discord标准用户提及格式做全局替换,支持批量移除所有被提及的用户,不限于第一个提及用户。
- 保留了原代码中
else分支的doSomething()逻辑,修复变量作用域报错问题。 - 补充空内容兜底逻辑,避免发送空消息触发Discord接口报错。
内容的提问来源于stack exchange,提问作者keisi
相关产品推荐
相关产品推荐

