如何实现向指定提及channel发送带user提及message的自定义命令?
原代码存在的典型问题
- 变量命名不统一:代码中把获取到的提及频道赋值给了
channell,后续取值时却调用了未定义的channel变量,运行时会直接触发引用错误 - 多余的无效取值步骤:
message.mentions.channels.first()返回的本身就是可以直接调用方法的频道实体,不需要将其转成字符串格式,再去缓存里重复查找 - 缺少边界校验:没有判断用户是否按格式输入了提及对象,当输入缺失@用户、#频道时,代码会直接抛出空值相关的运行错误
修正后的可实现代码
// 获取命令消息中附带的提及目标 const targetUser = message.mentions.users.first(); const targetChannel = message.mentions.channels.first(); // 前置校验,给执行命令的用户返回清晰的格式提示 if (!targetUser) return message.reply("请在命令中@需要被提及的目标用户"); if (!targetChannel) return message.reply("请在命令中#指定消息要发送到的目标频道"); // 直接调用频道实例的send方法发送带用户提及的消息 targetChannel.send(`<@${targetUser.id}>`);
可选的优化方向
- 可以增加权限判断逻辑:发送消息前先校验执行命令的用户是否拥有目标频道的发言权限,避免越权发送的异常
- 可以配置消息的提及权限:如果发送的消息没有触发@提醒效果,可以在send方法中传入allowedMentions参数,明确允许提及对应目标用户
- 注意适配你当前使用的discord.js版本:上述写法适配目前主流的v14版本,旧版本的API逻辑存在一定差异
内容的提问来源于stack exchange,提问作者Ha t
相关产品推荐
相关产品推荐

