【问题标题】:Is it possible to format a value that we received from an array to make it something else是否可以格式化我们从数组接收到的值以使其成为其他内容
【发布时间】:2021-10-01 21:51:59
【问题描述】:

我的标题并没有真正解释太多,所以这里是一个解释。

目前,我的 Discord 机器人上有一个命令,可以显示 Mojang 的服务器及其状态。

代码如下:

const Discord = require("discord.js");
const { get } = require("https");

module.exports.run = async(bot, message, args) => {
    //const member = message.mentions.members.first() || message.member

    get("https://status.mojang.com/check", (res) => {
        const { statusCode } = res;
        if (statusCode != 200) {
        res.resume;
        }
        res.setEncoding("utf8");
        let rawData = '';
        res.on("data", (chunk) => {
            rawData += chunk;
        });
        res.on("end", () => {
            try {
                const parsedData = JSON.parse(rawData);

                console.log(parsedData[0]);
                console.log(parsedData[1]);

                message.channel.send({
                    embed: {
                        color: 0xe61616,
                        title: `Mojang API Status`,
                        fields: [
                          {
                            name: "minecraft.net",
                            value: parsedData[0]['minecraft.net']
                          },
                          {
                            name: "session.minecraft.net",
                            value: parsedData[1]['session.minecraft.net']
                          },
                          {
                            name: "account.mojang.com",
                            value: parsedData[2]['account.mojang.com']
                          },
                          {
                            name: "authserver.mojang.com",
                            value: parsedData[3]['authserver.mojang.com']
                          },
                          {
                            name: "sessionserver.mojang.com",
                            value: parsedData[4]['sessionserver.mojang.com']
                          },
                          {
                            name: "api.mojang.com",
                            value: parsedData[5]['api.mojang.com']
                          },
                          {
                            name: "textures.minecraft.net",
                            value: parsedData[6]['textures.minecraft.net']
                          },
                          {
                            name: "mojang.com",
                            value: parsedData[7]['mojang.com']
                          }
                        ],
                        footer: {
                            text: `${bot.user.username} - Copyright 2021 - 2025`
                        }
                    }
                });

                console.log(parsedData);
            } catch (e) {
                console.error(e.message);
            }
        });
            }).on("error", (err) => {
                console.error(err.message);
            });
}

结果就是数组所说的,所以minecraft.net green

[
  { "minecraft.net": "red" },
  { "session.minecraft.net": "green" }
]

但我想要的是,当它显示时,它是“minecraft.net: ????”。有可能吗?

【问题讨论】:

  • 不喜欢带有代码的外部站点,将其嵌入到 stackoverflow 上,并尝试使您的代码尽可能少,只包含最相关的部分。我们不需要你的整个机器人。

标签: javascript node.js arrays discord.js


【解决方案1】:

当然你可以格式化一个值。由于您从 API 收到的响应是一个对象数组,其中键是服务器名称,值是颜色/状态,您可以只检查值,如果它是字符串 green,则将其替换为绿色表情符号,如果是字符串red,则将其替换为红色。

您也可以使用node-fetch 而不是使用内置的http 模块。

要获取每个对象的键和值,可以使用Object.entries() 方法。它返回一个键值对数组,因此您需要获取第一个。要获取字段,您可以遍历响应并为每个对象返回一个新对象,其中 name 是服务器的名称,value 是表情符号(基于绿色/红色值):

const fetch = require('node-fetch');
// ...
module.exports.run = async (bot, message, args) => {
  try {
    const res = await fetch('https://status.mojang.com/check');
    const json = await res.json();
    const statusEmojies = {
      green: '?',
      red: '?',
    };
    const fields = json.map((server) => {
      const [name, status] = Object.entries(server)[0];
      return {
        name: name,
        value: statusEmojies[status],
      };
    });
    const embed = new MessageEmbed()
      .setColor(0xe61616)
      .setTitle('Mojang API status')
      .addFields(fields);

    message.channel.send(embed);
  } catch (error) {
    console.log(error);
    message.channel.send('Oops, there was an error. Try again later!');
  }
};

您也可以只创建一个字符串数组并在描述中使用它。至少,我认为这样看起来更好一些:

const fetch = require('node-fetch');
// ...
module.exports.run = async (bot, message, args) => {
  try {
    const res = await fetch('https://status.mojang.com/check');
    const json = await res.json();
    const statusEmojies = {
      green: '?',
      red: '?',
    };
    const fields = json.map((server) => {
      const [name, status] = Object.entries(server)[0];
      return `${statusEmojies[status]} ${name}`;
    });
    const embed = new MessageEmbed()
      .setColor(0xe61616)
      .setTitle('Mojang API status')
      .setDescription(fields.join('\n\n'));

    message.channel.send(embed);
  } catch (error) {
    console.log(error);
    message.channel.send('Oops, there was an error. Try again later!');
  }
};

【讨论】:

  • 顺便说一句,Object.fromEntries(data.map(Object.entries).flat()) 是一种从对象数组中创建单个对象的巧妙方法。
猜你喜欢
  • 2017-12-12
  • 1970-01-01
  • 2021-11-16
  • 2019-09-12
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多