node.js - 使用 discord.js 命令处理程序捕获 NodeJS 错误
问题描述
我正在创建一个Discord 机器人,但在捕捉我的机器人发送的错误时遇到了一些问题。我正在使用自定义命令处理程序,效果很好。
Fs.readFile(`./database/prefixes/prefixes.json`, "utf8", (err: Error, data): void => {
data = JSON.parse(data);
const prefix: string = data[message.author.id] == undefined ? "ma!" : data[message.author.id];
const msg: string = message.content;
const args: string[] = message.content.slice(prefix.length).trim().split(" ");
const cmd: string = args.shift().toLowerCase();
if (!msg.startsWith(prefix)) {
return checkCustomCommands();
}
let ops: {} = {
queue: queue
}
try {
require(checkFolders(cmd)).run(Client, message, args, ops); // maybe catching just there?
Logger.log(`${message.author.tag} just used the ${cmd} power in ${message.guild.name}.`);
} catch (err) {
Logger.log(`The command ${message.author.tag} tried to call in ${message.guild.name} doesen't seem to exist.`);
}
});
function checkCustomCommands() {
let content = JSON.parse(Fs.readFileSync('./database/commands/commands.json', 'utf8'));
try {
if (content[message.guild.id][message.content] == undefined) {
return;
} else {
message.channel.send(content[message.guild.id][message.content]);
}
} catch (err) {
return;
}
}
function checkFolders(command) {
let folders = ["moderation", "fun", "music", "info", "game"];
var files: string[];
var finalPath: string;
folders.forEach(folder => {
files = Fs.readdirSync(`./src/commands/${folder}`);
files.forEach(file => {
if (file.split(".")[0] == command) {
return finalPath = `./../commands/${folder}/${file.split(".")[0]}.js`;
}
});
});
return finalPath;
}
但有时,我的机器人会将我无法捕获的各种错误发送到命令文件中,导致我的机器人被关闭。有什么方法可以防止在命令处理程序中发生这种情况,或者我可以采取什么措施来捕获这些错误?
非常感谢,如果需要,我可以提供更多代码,即使命令处理程序的最大块就在那里 ^
解决方案
我已经很晚了,但我觉得我应该回答我自己的问题,现在我可以这样做了哈哈
捕获这些错误的主要方法是unhandledRejection
通过 Node 监听事件process
。
我是这样做的:
async function handleRejections() {
process.on("unhandledRejection", (error: Error) => {
const errorEmbed: Discord.MessageEmbed = new Discord.MessageEmbed()
.setDescription("<:no:835565213322575963> An error has been detected... \n" + `\`\`\`${error.stack}\`\`\``)
.setTimestamp()
.setFooter(client.user.username, client.user.displayAvatarURL())
.setColor("DARK_RED")
logError(client, errorEmbed);
});
}
确保在项目代码的最开始调用该函数,甚至在机器人启动之前。
我个人将这些错误记录到我服务器上的 Discord 频道中,以便我可以轻松检查它们。而已!希望有帮助。继续编码:D
推荐阅读
- c++ - 使用 QOpenGLFramebufferObject 时深度测试不起作用
- android - 如何以编程方式翻译 Drawable Gradient?
- android - 使用 VB.NET 向 android 模拟器发送通知得到错误 401
- php - 使用 var_export() 对数组和输出结果进行排序
- c# - 如何检查当前系统是否介于给定日期时间之间?C#
- c# - 如何在实体框架中拦截和更改插入语句
- javascript - 如何检查对象数组中的对象是否都具有特定的结构并且不为空?
- excel - 如何使用 vba 粘贴这些值而不是公式
- php - 如何仅按日期搜索数据
- node.js - 如何使用猫鼬创建多站点 url 以将特定信息存储到特定站点