discord.js - 如何使用 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);
}
});
解决方案
fs
不提供提供Promise
文件的可能性,但它可以使用回调而不是承诺异步读取文件。但在fs
模块中,您可以使用fs/promises
(aka fs.promises
)。这是相同的代码。我纠正了 1 个问题,添加了fsp
var(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 });
},
};
推荐阅读
- python - 熊猫日期错误
- c# - Dotnetcore 3.1 中间件 HttpContext.Request 在内存中 TestServer 集成测试期间中间件运行之前已经为空
- r - 创建具有多个变量的 VCorpus(或 VectorSource)?
- node.js - 无法使用 Mongoose 创建复合索引
- html - CSS鼠标悬停闪烁问题
- spring - JPA创建实体一张表有常量
- sql - SQL Server:如果在某些列上不重复,则插入记录
- machine-learning - 隐藏层矩阵的列在skip-gram模型中代表什么
- python - 未找到带有参数 '('',)' 的 'post_detail' 的反向操作。尝试了 1 种模式:['post/(?P
[-\\w]+)/$'] - javascript - 切割异常堆栈跟踪的一部分?