You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的渲染规则和数据有效性,可按以下步骤修复:

  1. 替换换行符并设置字段属性
    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
}));
  1. 验证角色ID有效性
    确保数据库中AdminRole存储的是纯数字的Discord角色ID,而非角色名称或其他格式。可以添加日志排查:
console.log("获取到的角色ID列表:", admins.map(item => item.AdminRole));

如果ID无效,<@&${role}>无法解析为有效角色提及,也会导致排版异常。

  1. 级别排序(可选)
    如果需要按管理员级别升序展示,可对级别排序后再生成字段:
// 按级别数值排序
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:30:26