首页 > 解决方案 > 如何使用 async/await 读取文件?

问题描述

const Discord = require('discord.js');
const { MessageEmbed } = require('discord.js');
const fs = require('fs');

module.exports = {

  name: 'prefix',
  aliases: ['setprefix'],
  description: 'Установить новый префикс на вашем сервере',
  execute(message, args) {
  if (!message.member.hasPermission('MANAGE_SERVER'))
    return message.reply(' Не не не.');
  if (!args[0] || args[0 == 'help'])
    return message.reply(`Использование: prefix <Тут ваш префикс> `);

  let prefixes = JSON.parse(fs.readFileSync('./prefixes.json', 'utf8'));

  prefixes[message.guild.id] = {
    prefix: args[0]
  };

  fs.writeFile('./prefixes.json', JSON.stringify(prefixes), (err) => {
    if (err) console.log(err)
  })

  let pEmbed = new MessageEmbed()
  .setColor('#000001')
  .setTitle('Префикс изменён!')
  .setDescription(`Новый префикс на сервере **${args[0]}**`)

  message.channel.send(pEmbed)
  message.delete({ timeout: 10000 })

}}
  let prefixes = JSON.parse(fs.readFileSync('./prefixes.json', 'utf8'));

  if (!prefixes[message.guild.id]) {
    prefixes[message.guild.id] = {
        prefix: config.prefix
    };
}

let prefix = prefixes[message.guild.id].prefix;

如果我改变前缀,机器人停止音乐。

试图通过'ReadFile`来做,它返回一个回调错误

我知道我可以使用readFileSync,但如果我这样做了,我知道我永远不会理解async/await,我只会埋葬这个问题。

升级版:

client.on('message', async (message) => {
  if (message.author.bot) return;
  if (!message.guild) return;

  let prefixes = JSON.parse(fs.readFileSync('./prefixes.json', 'utf8'));

  if (!prefixes[message.guild.id]) {
    prefixes[message.guild.id] = {
        prefix: config.prefix
    };
}

let prefix = prefixes[message.guild.id].prefix;
// let msgArray = message.content.split(" ");
// let cmd = msgArray[0];
// if(cmd.slice(0, prefix.length) !== prefix) return;
// let args = msgArray.slice(1);
// let cmdFile = client.commands.get(cmd.slice(prefix.length))
// if(cmdFile) cmdFile.run(client, message, args);

const prefixRegex = new RegExp(`^(<@!?${client.user.id}>|${escapeRegex(prefix)})\\s*`);
if (!prefixRegex.test(message.content)) return;

const [matchedPrefix] = message.content.match(prefixRegex);

const args = message.content.slice(matchedPrefix.length).trim().split(/ +/);
const commandName = args.shift().toLowerCase();

const command =
  client.commands.get(commandName)  ||
  client.commands.find((cmd) => cmd.aliases && cmd.aliases.includes(commandName));

  if (message.content.startsWith(prefix) && commandFiles) {
    if (message.deletable) {
      try {
        await message.delete();
      } catch(e) {
        console.error(e);
      }
      }
    }

  if (!command) return;

  if (!cooldowns.has(command.name)) {
    cooldowns.set(command.name, new Collection());
  }

  const now = Date.now();
  const timestamps = cooldowns.set(command.name);
  const cooldownAmount = (command.cooldown || 1) * 1000;

  if (timestamps.has(message.author.id)) {
    const expirationTime = timestamps.get(message.author.id) + cooldownAmount;

    if (now < expirationTime) {
      const timeLeft = (expirationTime - now) / 1000;
      return message.reply(
      `Пожалуйста подождите ${timeLeft.toFixed(1)} секунд перед повторным использованием \`${command.name}\` команд.`
      );
    }
  }
  timestamps.set(message.author.id, now);
  setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);

  try {
    command.execute(message, args);
  } catch (error) {
    console.error(error);
    message.reply('Произошла ошибка при выполнении этой команды.')
      .then(message => message.delete({ timeout: 5000 }))
      .catch(console.error);
  }
});

标签: discord.js

解决方案


fs不提供提供Promise文件的可能性,但它可以使用回调而不是承诺异步读取文件。但在fs模块中,您可以使用fs/promises(aka fs.promises)。这是相同的代码。我纠正了 1 个问题,添加了fspvar(fs 承诺),并用它来读取您的prefixes.json文件。fs.readFileSync不过完全没问题。

const Discord = require("discord.js");
const { MessageEmbed } = require("discord.js");
const fs = require("fs");
const fsp = fs.promises; // ++

module.exports = {
    name: "prefix",
    aliases: ["setprefix"],
    description: "Установить новый префикс на вашем сервере",
    async execute(message, args) {
        if (!message.member.hasPermission("MANAGE_SERVER"))
            return message.reply(" Не не не.");
        if (!args[0] || args[0] == "help") /** Correction */
            return message.reply(`Использование: prefix <Тут ваш префикс> `);

        let prefixes = JSON.parse(await fsp.readFile("prefixes.json", "utf8")); // Using fsp

        prefixes[message.guild.id] = {
            prefix: args[0],
        };

        fs.writeFile("./prefixes.json", JSON.stringify(prefixes), (err) =>
            err ? console.error(err) : null
        );

        let pEmbed = new MessageEmbed()
            .setColor("#000001")
            .setTitle("Префикс изменён!")
            .setDescription(`Новый префикс на сервере **${args[0]}**`);

        message.channel.send(pEmbed);
        message.delete({ timeout: 10000 });
    },
};

推荐阅读