Discord.js中admins_view命令角色未拆分、换行失效求助
问题描述
我使用Node.js v18.15.0与Discord.js开发了admins_view斜杠命令,意图按管理员级别拆分角色并通过\n换行显示,但实际输出未拆分角色,换行也未生效。期望每个管理员级别作为Embed的单独字段,每个角色单独一行展示。
代码示例
const { EmbedBuilder, SlashCommandBuilder } = require('discord.js'); const mongoose = require('mongoose'); const AdminsSchema = mongoose.model('Admins Binds'); module.exports = { data: new SlashCommandBuilder() .setName('admins_view') .setDescription('View all the admins level for this server.'), async execute(interaction) { const discordavatar = interaction.user.displayAvatarURL(); const discordUsername = interaction.user.username; const guild_id = interaction.guild.id; const guildname = interaction.guild.name; const admins = await AdminsSchema.find({ guildid: guild_id }).select('AdminRole Adminlevel'); const adminLevels = admins.reduce((levels, admin) => { if (!levels[admin.Adminlevel]) { levels[admin.Adminlevel] = []; } levels[admin.Adminlevel].push(admin.AdminRole); return levels; }, {}); const adminFields = Object.entries(adminLevels).map(([level, roles]) => ({ name: `Admin Level ${level}`, value: roles.map(role => `- <@&${role}>`).join('\n'), })); try { const message = new EmbedBuilder() .setColor(0x0099FF) .setTitle('Server Admins') .setDescription(`Listing server level admins for the server ${guildname}`) .setAuthor({ name: discordUsername, iconURL: interaction.user.displayAvatarURL() }) .addFields(adminFields); await interaction.reply({ embeds: [message] }); } catch (err) { console.log(err); const errorEmbed = new EmbedBuilder() .setDescription(`An error occurred while loading server admins: ${err.message}`) .setColor('#ff2d08'); interaction.edit({ embeds: [errorEmbed], ephemeral: false }); } } };
解决方案
问题源于Discord Embed的渲染规则和数据有效性,可按以下步骤修复:
- 替换换行符并设置字段属性
Discord Embed对<br>标签的换行渲染比\n更稳定,同时显式设置inline: false确保每个字段独占一行,避免角色挤在一起:
const adminFields = Object.entries(adminLevels).map(([level, roles]) => ({ name: `Admin Level ${level}`, value: roles.map(role => `- <@&${role}>`).join('<br>'), inline: false }));
- 验证角色ID有效性
确保数据库中AdminRole存储的是纯数字的Discord角色ID,而非角色名称或其他格式。可以添加日志排查:
console.log("获取到的角色ID列表:", admins.map(item => item.AdminRole));
如果ID无效,<@&${role}>无法解析为有效角色提及,也会导致排版异常。
- 级别排序(可选)
如果需要按管理员级别升序展示,可对级别排序后再生成字段:
// 按级别数值排序 const sortedLevels = Object.entries(adminLevels).sort(([a], [b]) => parseInt(a) - parseInt(b)); const adminFields = sortedLevels.map(([level, roles]) => ({ name: `Admin Level ${level}`, value: roles.map(role => `- <@&${role}>`).join('<br>'), inline: false }));
内容的提问来源于stack exchange,提问作者Xeffort
相关产品推荐
相关产品推荐

