Javascript 如何为Discord.js bot编写事件/命令处理程序?

Javascript 如何为Discord.js bot编写事件/命令处理程序?,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,我已经开始使用Discord.js库在Node.js中创建一个Discord bot。但是,所有代码都包含在一个索引文件中 如何将命令和事件分别组织到单独的文件中,并在需要时运行它们?为bot组织代码的一种优秀、干净的方法是使用事件和命令处理程序 简单地说。 您从一个小索引文件开始初始化客户机和其余代码。事件处理程序保存每个事件的文件,并在事件发出时调用这些文件。然后,在客户端的消息事件中,通过从预期命令的文件运行代码,您可以避免长if链和开关/案例 什么是模块? 您需要了解的基本Node.

我已经开始使用Discord.js库在Node.js中创建一个Discord bot。但是,所有代码都包含在一个索引文件中


如何将命令和事件分别组织到单独的文件中,并在需要时运行它们?

为bot组织代码的一种优秀、干净的方法是使用事件和命令处理程序


简单地说。 您从一个小索引文件开始初始化客户机和其余代码。事件处理程序保存每个事件的文件,并在事件发出时调用这些文件。然后,在客户端的
消息
事件中,通过从预期命令的文件运行代码,您可以避免长
if
链和
开关
/
案例


什么是模块? 您需要了解的基本Node.js结构是一个

[模块是一组]要包含在应用程序中的功能

引自

因此,可以将模块想象成一个整齐地贴好胶带的盒子,其中包含代码片段。你可以把包裹带到某个地方,打开它,然后打开包装。在JavaScript术语中,您可以在程序中的其他地方需要该模块,并利用其中包含的代码。模块可以包含变量、类、函数等,您需要在代码的不同位置使用它们


使用模块和导出。 既然您知道了模块是什么,那么您就必须了解如何使用它们

对于处理程序,您只需要使用
模块
对象的
导出
属性。通过对模块使用,返回。考虑下面的设置。

单一出口。
Question.js

课堂提问{
构造函数(作者、详细信息){
this.author=作者;
this.details=详细信息;
这个。答案=[];
}
}
module.exports=问题;
newQuestion.js

const Question=require('./Question.js');
const myQuestion=新问题(“我”,“如何编写事件/命令处理程序?”);
Question.js
中,将创建一个新类Question,并将其分配给
module.exports
。然后,当
newQuestion.js
中需要
Question.js
时,
Question
被声明为导出类。它可以像往常一样使用

多重出口。 现在,例如,如果您需要导出多个类

Posts.js

类问题{…}
类答案{…}
module.exports={问题,答案};
//或者。。。
//module.exports.Question=问题;
//module.exports.Answer=答案;
newQuestion.js

const{Question}=require('./Posts.js');
const myQuestion=新问题(…);
这样,
module.exports
被定义为一个对象,包含创建的类。这意味着
require()
将返回一个对象,因此您可以从该对象中选择所需的类


创建事件处理程序。 您应该首先为事件创建一个文件夹,然后为每个事件创建一个文件。根据事件的名称命名文件。例如,对于您的客户端,该文件应命名为
message.js

设置事件文件。 实现您现在对模块的了解,您可以编写事件文件。例如

message.js

module.exports=(客户端,消息)=>{
//此代码将在以下情况下执行:
//发出“消息”事件。
};
设置处理程序。 要生成实际的处理程序,可以在函数中放置以下代码以加载事件

const requireAll=require('require-all');//别忘了安装!
const files=requireAll({//需要您的
dirname:`${\uu dirname}/events`,//具有名称的事件目录
筛选器://^(?)(.+)\.js$///以“.js”结尾而不是开始
});                                          // 使用“-”(一种禁用文件的方法)。
client.removeAllListeners();//防止重新加载时重复侦听器。
//注意:这会删除侦听器
//附件为DISCORD.JS!
对于(文件中的const name){//遍历files对象
const event=files[name];//并将侦听器附加到每个
//事件,将“客户端”作为
on(name,event.bind(null,client));//第一个参数,其余参数
//预期参数的定义
console.log(`Event-loaded:${name}`);//然后,记录
}//成功加载到控制台。
现在,当您的客户机发出一个您有文件要处理的事件时,其中的代码将运行


创建命令处理程序。 与事件处理程序一样,您应该首先为命令创建一个单独的文件夹,然后为每个命令创建文件

设置命令文件。 您可以导出“运行”函数和配置对象,而不是仅导出一个函数

help.js

module.exports.run=async(客户端、消息、参数)=>{
//此代码将被执行为
//运行“help”命令。
};
module.exports.config={
姓名:“帮助”,
别名:['h']//即使不需要别名,也将其保留为数组。
};
设置处理程序。 就像事件处理程序一样,将此代码放在函数中以加载命令

const requireAll=require('require-all');//使用相同的npm模块。。。
const files=requireAll({//需要您的
dirname:`${\uuu dirname}/commands`,//command di