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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:09:01