Discord.js如何实现通过用户原始ID直接执行封禁等命令?
问题原因
你当前代码仅支持@提及触发的核心问题是只从本地服务器成员缓存members.cache中读取ID对应用户,若目标用户未被缓存(比如未在服务器发言、离线太久未加载),就会返回空值,无法匹配到用户。
调整方案
你可以改用异步拉取成员的方式替换原有的缓存读取逻辑,不受本地缓存限制,同时兼容@提及和直接输入ID两种使用方式:
调整后完整代码
// 注意:需将当前命令的处理函数声明为async,否则无法使用await语法 async function commandHandler(message, args) { let fUser; // 优先匹配@提及的用户 if (message.mentions.members.size) { fUser = message.mentions.members.first(); } // 无提及则校验输入参数是否为符合格式的Discord用户ID,再拉取用户 else if (args[0] && /^\d{17,20}$/.test(args[0])) { try { // 强制调用接口拉取成员,不依赖本地缓存 fUser = await message.guild.members.fetch(args[0]); // 若需要支持封禁未加入本服务器的用户,把上面一行替换为: // fUser = await message.client.users.fetch(args[0]); } catch (err) { fUser = null; } } if (!fUser) return message.channel.send("请输入有效的成员@提及或者用户ID").then(msg => msg.delete({ timeout: 8000 })).catch(console.error); // 后续原有封禁逻辑直接使用fUser即可 }
关键调整说明
- 新增了Discord用户ID格式校验规则,避免无效请求
- 用
await guild.members.fetch()替换原有的cache.get(),强制从官方接口拉取用户信息,只要输入的ID是本服务器内的有效用户就能正常识别 - 保留了原有的@提及使用方式,两种触发方式可共存
- 若需要支持封禁未加入服务器的用户,只需把拉取成员的逻辑替换为拉取全局用户即可,调用
guild.members.ban(fUser)就能完成跨服务器封禁
内容的提问来源于stack exchange,提问作者Lorelei Ramirez
相关产品推荐
相关产品推荐

