Discord.js单指令添加多个身份组时首个角色被自动移除问题求助
问题原因
- 你调用的
GuildMemberRoleManager.add()是异步方法,返回Promise对象,现有代码没有加await等待第一个添加操作完成,两次添加操作并发执行,后触发的请求会覆盖前一个请求的角色变更,因此只会保留最后一个添加的角色。 - 现有写法的
try/catch无法捕获异步操作抛出的错误,报错不会进入你预设的错误处理逻辑。 - 代码中为空的
.then()没有任何实际作用,无法解决异步时序问题。
修复方案
有两种可行修复方式,优先选择第一种:
方式1:单次调用传入角色数组(推荐)
add方法原生支持传入角色ID/角色对象的数组,一次请求即可完成多个角色的添加,从根本上避免并发冲突:
// 注意:需要给当前消息处理的外层函数添加async关键字,才能使用await语法 if(msg.content === "Yes" ){ const arr = ['878722965972348938', '878722966660214844', '878722965070544926'] if(message.member.roles.cache.some(r => arr.includes(r.id))) return message.channel.send('⚠️You already have it assigned') try{ // 单次传入两个角色的数组即可同时添加 await message.member.roles.add([Blue, Verified]) message.channel.send(`${msg.content} Assigned✅`); message.channel.send(`Go to <#879068760374378566> to complete verification!`); } catch(error) { message.channel.send("⚠️Error has occurred, please contact server adminstrator."); console.log(error) } }
方式2:顺序等待异步操作完成
如果你确实需要分开执行两次添加操作,要在每个异步操作前加await保证前一个操作完成后再执行下一个:
// 注意:需要给当前消息处理的外层函数添加async关键字,才能使用await语法 if(msg.content === "Yes" ){ const arr = ['878722965972348938', '878722966660214844', '878722965070544926'] if(message.member.roles.cache.some(r => arr.includes(r.id))) return message.channel.send('⚠️You already have it assigned') try{ // 等待Blue角色添加完成 await message.member.roles.add(Blue) // 再执行Verified角色添加 await message.member.roles.add(Verified) message.channel.send(`${msg.content} Assigned✅`); message.channel.send(`Go to <#879068760374378566> to complete verification!`); } catch(error) { message.channel.send("⚠️Error has occurred, please contact server adminstrator."); console.log(error) } }
内容的提问来源于stack exchange,提问作者Randosa
相关产品推荐
相关产品推荐

