Discord Bot执行/update命令时角色消息显示<@&undefined>问题
问题根源
你在处理addedRoles时,存入的是角色ID字符串,但生成消息时错误地尝试访问它的.id属性,导致出现<@&undefined>。
具体细节:
rolesToAdd是从rolesArray过滤得到的角色ID数组(纯字符串)addedRoles.push(...rolesToAdd)直接将这些ID存入数组- 后续
addedRoles.map(role =><@&${role.id}>)中,role本身就是ID字符串,没有.id属性,因此role.id返回undefined
而removedRoles存入的是完整的Role对象,所以.id能正常取值,这部分显示正常。
修复方案
两种可行修复方式,任选其一即可:
方案1:直接用角色ID构建提及
既然addedRoles里存的是ID,直接用ID拼接Discord角色提及格式:
{ name: 'Roles Added', value: addedRoles.length ? addedRoles.map(roleId => `<@&${roleId}>`).join('\n') : 'None' },
方案2:存入Role对象到addedRoles
在添加角色时,先把ID转换为Role对象再存入数组,这样后续无需修改消息代码:
// 替换原有的添加角色逻辑 if (rolesToAdd.length > 0) { // 将角色ID转换为Role对象 const roleObjects = rolesToAdd.map(id => guild.roles.cache.get(id)); await guildMember.roles.add(roleObjects); addedRoles.push(...roleObjects); }
额外优化建议
你代码中重复调用了noblox.getRankInGroup和noblox.getIdFromUsername,可以提前缓存结果减少重复请求:
// 提前获取ID和等级,避免重复调用API const robloxId = await noblox.getIdFromUsername(robloxUsername); const rankNumber = await noblox.getRankInGroup(groupid, robloxId); const inGroup = rankNumber > 0; // 假设rank为0代表不在群组内
内容的提问来源于stack exchange,提问作者Xeffort
相关产品推荐
相关产品推荐

