我重构了我的代码以消除一些冗余,其中的一部分是为生成我的机器人作为回复发送的嵌入而创建助手函数.对于其中一个斜杠命令,机器人应该发回多个嵌入.

mercHelper.js(将辅助函数放置在utils文件夹中)

const { MessageEmbed } = require('discord.js');
const { request } = require('undici');
const { MERC_URL, BASE_URL } = require('./utils');
const { mercAliases } =require('./mercAliases')

async function getMerc( mercName ){
    if (mercName in mercAliases){ mercName = mercAliases[mercName] };
    const { body } = await request(MERC_URL + encodeURIComponent(mercName));
    const { mercs } = await body.json();

    const [mercAnswer] = mercs;
    const mercEmbed = new MessageEmbed()
        .setTitle(mercAnswer.name)
        .setDescription('Mentor notes will go here.')
        .setImage(BASE_URL + mercAnswer.screenshot)
    const mercLeaderEmbed = new MessageEmbed()
        .setImage(BASE_URL+'/commanders/'+ mercAnswer.commander_id+'/screenshot')
        .setDescription('Name of mercenary group leader: '+ mercAnswer.bossname)
    const mercTroopEmbed = new MessageEmbed()
        .setImage(BASE_URL+'/commanders/'+ mercAnswer.unit_id+'/screenshot')
        .setDescription('Number of units: '+ mercAnswer.nrunits)
    return [mercEmbed, mercLeaderEmbed, mercTroopEmbed];
    
}

module.exports = { getMerc }

merc.js(斜杠命令文件)

const { SlashCommandBuilder } = require('@discordjs/builders');
const { getMerc } = require('../utils/mercHelper');


module.exports = {
    data: new SlashCommandBuilder()
        .setName('merc')
        .setDescription('Replies with information about a merc')
        .addStringOption(option => option.setName('merc_name').setDescription('Enter the name of the mercenary').setRequired(true)),

    async execute(interaction) {
        let mercName = interaction.options.getString('merc_name');
        const mercEmbed = await getMerc( mercName );
        const mercLeaderEmbed = await getMerc( mercName );
        console.log('mercLeaderEmbed'+mercLeaderEmbed)
        const mercTroopEmbed = await getMerc( mercName );
        console.log('mercTroopEmbed'+mercTroopEmbed)
        await interaction.reply({ embeds: [mercEmbed, mercLeaderEmbed, mercTroopEmbed] });
    },
};

当我运行我当前拥有的代码时,我得到以下错误消息:DiscordAPIError: Invalid Form Body,然后是空data.embeds.

我认为这是因为当我从helper函数"返回"嵌入时,它正在以某种方式运行.我在助手文件中添加了console.log个--所有信息都已存在.

当我try 在斜杠命令文件(merc.js)中执行相同的操作时,我得到mercLeaderEmbed[object Object],[object Object],[object Object],第二个console.log也是如此.

也许return运行正常,但我没有正确调用信息,这导致[object Object]返回,但我不确定如何解决该问题/如何重写代码以避免这种情况.

推荐答案

您将调用await getMerc(mercName)三次,并将相同的值赋给三个不同的变量(mercEmbedmercLeaderEmbedmercTroopEmbed).如果从getMerc返回三个嵌入([mercEmbed, mercLeaderEmbed, mercTroopEmbed])的数组,则不需要多次调用它.

当您记录'mercLeaderEmbed'+mercLeaderEmbed时,您将收到mercLeaderEmbed[object Object],[object Object],[object Object],因为mercLeaderEmbed已经是这三个对象的数组(由于您将数组与一个字符串连接在一起,所以它们被串行化).

我认为您想要的要么是像这样解构返回的数组:

async execute(interaction) {
  let mercName = interaction.options.getString('merc_name');
  let [mercEmbed, mercLeaderEmbed, mercTroopEmbed] = await getMerc(mercName);

  await interaction.reply({
    embeds: [mercEmbed, mercLeaderEmbed, mercTroopEmbed],
  });
}

或者只发送返回的嵌入数组,如下所示:

async execute(interaction) {
  let mercName = interaction.options.getString('merc_name');
  let embeds = await getMerc(mercName);

  await interaction.reply({ embeds });
}

Javascript相关问答推荐

Phaser框架-将子对象附加到Actor

按钮未放置在html dis位置

通过在页面上滚动来移动滚动条

当点击注册页面上的注册按钮时,邮箱重复

在带有背景图像和圆形的div中添加长方体阴影时的重影线

在react JS中映射数组对象的嵌套数据

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

对网格项目进行垂直排序不起作用

在FAQ Accodion应用程序中使用React useState时出现问题

在D3条形图中对具有相同X值的多条记录进行分组

将嵌套数组的元素乘以其深度,输出一个和

不同表的条件API端点Reaction-redux

顶点图使用组标签更新列之间的条宽

每隔3个项目交替显示,然后每1个项目交替显示

AG-GRIDreact 显示布尔值而不是复选框

如何压缩图像并将其编码为文本?

React数组查找不读取变量

暂停后只有一次旋转JS

如何使用Angular JS双击按钮