斜线命令 - Discord.js

ban*_*pie 2 javascript node.js discord discord.js

尝试运行时出现错误:(node: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);
Run Code Online (Sandbox Code Playgroud)

Can*_*ide 8

已接受答案的问题

接受的答案在几个方面是不正确的。为了将来可能偶然发现这个问题的任何人(并且会被接受的答案误导相信斜线命令不能在 discord.js 中实现)。

嗯,答案很简单。根据 Discord.js 文档,Class Client 没有 api 属性。这就是为什么你有未定义的错误。

不正确。该Client确实有一个api属性。或者更确切地说,它apiBaseClient它扩展的类继承属性。这可以在 的源代码中找到BaseClient。这确实没有记录在 discord.js 文档中。这是故意的,因为该api财产旨在成为私有财产,更多的是供 discord.js 自己使用而不是一般用途。您可能会在源代码中注意到该属性带有 注释@private,这通常表示它不会出现在文档中。在 discord.js 类中存在许多这样的私有属性和方法,它们没有记录,但可以在您自己的代码中使用。

看起来您正在查看的教程有点过时,或者可能是导师手动添加了此属性,因为 Discord.js 具有相关类,例如 Application 和 ClientApplication 但我仍然没有在那里看到 api 属性。

OP 的教程实际上比已接受的答案发布和使用的教程更新。在ApplicationClientApplication类不是在所有相关的,既不可以访问斜杠命令。也没有数百个不同的教程各自实现自己的api属性,所有这些都以完全相同的方式工作;他们都api在使用最新版本的 discord.js 中包含的属性。

如果您想在支持斜杠的 Discord 机器人上实现命令,只需在准备阶段后添加以下代码。

接受的答案误解了“斜线命令”是什么,并提供了代码只是为了创建带有前缀斜线的命令。这不是斜线命令系统。斜线命令允许您在用户输入输入时实时执行诸如记录、自动完成和验证用户正在输入的命令和命令参数等操作。

不是不应该。实际上,Discord.js 库更新得更频繁,[YouTube] 创作者用他们的视频来更新。我已经在我的答案中放置了 Discord.js 社区制作的相关指南。

是的,应该。数百个教程彼此使用相同的代码,包含api属性,指导开发人员如何在未修改的 discord.js 中使用斜杠命令。我不确定此评论的确切含义。

如果查看discord.js的实际源码,你会发现最新版本在api内部多次使用客户端的属性,通常是直接查询Discord API获取信息的.fetch()方法(如方法)。如果该api属性未定义并且您使用的是最新版本的 discord.js,那么您的大部分机器人将无法正常工作。因此,没有api属性的最新客户端类不是主要问题,这将我们引向真正的主要问题。

那么真正的问题是什么?

问题中确实没有提供足够的上下文来确定究竟是什么导致了问题中的问题。但是,我们可以将原因缩小到一些潜在的嫌疑人,特别是考虑到上述信息。仔细检查这些以确保它们不会导致您的问题:

  1. Discord.js 版本api早于 的版本不存在该属性v12。确保您使用的是最新版本的 discord.js。这很可能是问题的原因。
  2. 缺少访问权限。您需要application.commands在生成邀请链接时为您的机器人提供范围,否则您无法与 Slash 命令交互或创建 Slash 命令。这不应该真的导致api属性未定义,并且应该给你一个不同的错误,但值得仔细检查。

如果在简单的 discord.js 中使用斜杠命令仍然不适合你,即使在仔细检查这两个潜在问题后,你可能需要考虑另一种(稍微简单一些)实现斜杠命令的方法:discord-slash-命令客户端模块。

你可以像这样初始化这个模块:

const interactions = require("discord-slash-commands-client");

const iclient = new interactions.Client(
  "you unique bot token",
  "your bots user id"
);
Run Code Online (Sandbox Code Playgroud)

然后要获取所有现有斜线命令的列表,正如本问题中的代码试图做的那样,您需要对这个模块做的就是:

let commands = await iclient.getCommands();
Run Code Online (Sandbox Code Playgroud)

一条干净的线。就这么简单。这种替代方法的唯一缺点是该模块可能不像 discord.js 本身那样可靠地保持最新状态。但是,如果您无法弄清楚如何让斜线命令在 discord.js 本身中工作,那肯定会有所帮助。

如果您在这方面需要更多帮助或想要查看任一方法的更完整实现,这个问题有几个很好的工作示例,说明如何让 Slash Commands 代码在您的机器人上正常工作。