已接受答案的问题
接受的答案在几个方面是不正确的。为了将来可能偶然发现这个问题的任何人(并且会被公认的答案误导而相信 Slash Commands无法在 discord.js 中实现)。
嗯,答案很简单。根据 Discord.js 文档,Class Client 没有 api 属性。这就是为什么你有未定义的错误。
不正确。 Client 类确实有一个api 属性。或者更确切地说,它从它扩展的BaseClient 类继承api 属性。这可以在BaseClient 的source code 中找到。确实,discord.js 文档中没有记录这一点。这是有意的,因为api 属性旨在成为私有属性,更多的是供discord.js 自己使用而不是一般用途。您可能会注意到在源代码中,该属性使用@private 进行了注释,这通常表明它不会出现在文档中。 discord.js 类中存在许多这样的私有属性和方法,它们没有记录,但在您自己的代码中可用。
您正在查看的教程似乎有点过时了,或者可能是导师手动添加了这个属性,因为 Discord.js 有相关的类,比如 Application 和 ClientApplication 但我仍然没有看到 api 属性好吧。
OP 所使用的教程实际上比已接受的答案发布和使用的教程更新。 Application 和 ClientApplication 类根本不相关,因为它们都不能访问斜杠命令。数百个不同的教程也没有各自实现自己的 api 属性,它们都以完全相同的方式工作;他们都在使用包含在最新版本 discord.js 中的 api 属性。
如果您想通过斜杠支持向 Discord 机器人执行命令,只需在准备阶段之后添加以下代码。
接受的答案误解了“斜杠命令”是什么,并提供了简单的代码来创建带有斜杠作为前缀的命令。这不是 Slash Command 系统。斜线命令允许您在用户输入输入时实时执行记录、自动完成和验证用户输入的命令和命令参数等操作。
不应该。实际上,Discord.js 库的更新频率更高,[YouTube] 创作者使用他们的视频进行更新。我已经在我的答案中加入了 Discord.js 社区制作的相关指南。
是的,应该。数百个教程使用相同的代码,包含 api 属性,指导开发人员如何在未修改的 discord.js 中使用 Slash 命令。我不确定这条评论到底是什么意思。
如果你查看discord.js的实际源码,你会发现最新版本在内部多次使用客户端的api属性,通常在直接查询Discord API信息的方法中(例如@ 987654338@ 方法)。如果 api 属性未定义并且您使用的是最新版本的 discord.js,那么您的大部分机器人将无法正常工作。所以最新的客户端类没有api 属性不是主要问题,这让我们知道真正的主要问题是什么。
那么真正的问题是什么?
问题中确实没有提供足够的上下文来确定究竟是什么导致了问题中的问题。但是,我们可以将原因缩小到几个潜在的嫌疑人,特别是考虑到上述信息。仔细检查这些以确保它们不会导致您的问题:
-
Discord.js 版本。早于
v12 的版本不存在api 属性。确保您使用的是最新版本的 discord.js。这很可能是问题的原因。
-
缺少访问权限。在生成邀请链接时,您需要为您的机器人提供
application.commands 范围,否则您无法与 Slash 命令交互或创建。这不应该真的导致 api 属性未定义并且应该给你一个不同的错误,但值得仔细检查。
如果即使在仔细检查了这两个潜在问题之后,在简单的 discord.js 中使用斜线命令仍然无法为您工作,您可能需要考虑另一种(并且更简单)的方法来实现斜线命令:@ 987654323@模块。
你可以像这样初始化这个模块:
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 本身中工作,那肯定会有所帮助。
如果您在这方面需要更多帮助,或者希望看到任何一种方法的更完整实现,this question 有几个很好的工作示例,说明如何让 Slash 命令代码在您的机器人上正常工作。