javascript - 斜线命令 - Discord.js
问题描述
尝试运行时出现错误:(节点:9164)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“应用程序”
这是我的代码:
const discord = require('discord.js');
const client = new discord.Client();
const guildId = '820368493017825333';
client.on('ready', async () => {
console.log('ready');
const commands = await client.api.
applications(client.user.id)
.guilds(guildId)
.commands.get();
console.log(commands);
});
client.login(require(`./config.json`).Token);
解决方案
已接受答案的问题
接受的答案在几个方面是不正确的。为了将来可能偶然发现这个问题的任何人(并且会被公认的答案误导而相信 Slash Commands无法在 discord.js 中实现)。
好吧,答案很简单。根据 Discord.js 文档,Class Client 没有 api 属性。这就是为什么你有未定义的错误。
不正确。该类确实有一个Client
属性。或者更确切地说,它继承了它扩展的类的属性。这可以在源代码中找到。确实,discord.js 文档中没有记录这一点。这是有意的,因为该属性旨在成为私有属性,更多的是供 discord.js 自己使用,而不是一般用途。您可能会在源代码中注意到该属性用 注释,这通常表示它不会出现在文档中。discord.js 类中存在许多这样的私有属性和方法,它们没有文档记录,但可以在您自己的代码中使用。api
api
BaseClient
BaseClient
api
@private
您正在查看的教程似乎有点过时了,或者可能是导师手动添加了这个属性,因为 Discord.js 有相关的类,比如 Application 和 ClientApplication 但我仍然没有在那里看到 api 属性。
OP 所使用的教程实际上比已接受的答案发布和使用的教程更新。和Application
类ClientApplication
完全不相关,因为它们都不能访问斜杠命令。也没有数百个不同的教程每个都实现了自己的api
属性,它们都以完全相同的方式工作。他们都在使用api
最新版本的 discord.js 中包含的属性。
如果您想通过斜线支持向 Discord 机器人执行命令,只需在准备阶段之后添加以下代码。
接受的答案误解了“斜杠命令”是什么,并提供了简单的代码来创建带有斜杠作为前缀的命令。这不是 Slash Command 系统。斜杠命令允许您在用户输入输入时实时执行记录、自动完成和验证用户输入的命令和命令参数等操作。
不是它不应该。实际上,Discord.js 库的更新频率更高,[YouTube] 创作者使用他们的视频进行更新。我已经在我的答案中加入了 Discord.js 社区制作的相关指南。
是的,它应该。数百个教程使用相同的代码,包含该api
属性,指导开发人员如何在未修改的 discord.js 中使用 Slash 命令。我不确定这条评论到底是什么意思。
如果你查看 discord.js 的实际源码,你会发现最新版本在api
内部多次使用客户端的属性,通常在直接查询 Discord API 获取信息的方法(例如.fetch()
方法)中。如果该api
属性未定义并且您使用的是最新版本的 discord.js,那么您的大部分机器人将无法正常工作。所以最新的客户端类没有api
属性不是主要问题,这导致我们真正的主要问题是什么。
那么真正的问题是什么?
问题中确实没有提供足够的上下文来确定究竟是什么导致了问题中的问题。但是,我们可以将原因缩小到几个潜在的嫌疑人,特别是考虑到上述信息。仔细检查这些以确保它们不会导致您的问题:
- Discord.js 版本。
api
早于 的版本不存在该属性v12
。确保您使用的是最新版本的 discord.js。这很可能是问题的原因。 - 缺少访问权限。您需要
application.commands
在生成邀请链接时为您的机器人提供范围,否则您无法与 Slash 命令交互或创建。这不应该真的导致api
属性未定义并且应该给你一个不同的错误,但值得仔细检查。
如果即使在仔细检查了这两个潜在问题之后,在简单的 discord.js 中使用 Slash 命令仍然无法为您工作,您可能需要考虑一种替代(并且更简单)的方法来实现 Slash 命令:discord-slash-命令客户端模块。
你可以像这样初始化这个模块:
const interactions = require("discord-slash-commands-client");
const iclient = new interactions.Client(
"you unique bot token",
"your bots user id"
);
然后要获取所有现有斜杠命令的列表,正如这个问题中的代码试图做的那样,你需要对这个模块做的就是:
let commands = await iclient.getCommands();
一条干净的线。尽可能简单。这种替代方法的唯一缺点是该模块可能无法像 discord.js 本身那样可靠地保持最新状态。但是,如果您无法弄清楚如何让 Slash 命令在 discord.js 本身中工作,那肯定会有所帮助。
如果您在这方面需要更多帮助或希望看到这两种方法的更完整实现,这个问题有几个很好的工作示例,说明如何让 Slash 命令代码在您的机器人上正常工作。
推荐阅读
- git - 如何听取詹金斯对拉取请求事件的批准
- web-services - Yii2 的 REST Web 服务中找不到类错误
- javascript - 当添加新孩子时,firebase 在路径上侦听最近的 10 项而不会丢失第 10 项
- c# - C# 替换 foreach
- angular - 单击卡片上的按钮更改卡片内容样式
- angular - 角材料表数据源未正确绑定/更新,没有错误但没有任何作用
- javascript - 如何在javascript中使用文件阅读器将上传的文件内容显示为对象
- php - PHP - 将变量设置为等于函数,而不运行它
- angular - 在降价链接中使用角度路由器
- java - 具有限制和自定义比较器的部分排序集合