斜线命令 - Discord.js

时间:2021-03-14 00:55:39

标签: javascript node.js discord discord.js

我在尝试运行时遇到错误: (节点:9164)未处理的承诺拒绝警告:类型错误:无法读取未定义的属性“应用程序”

这是我的代码:

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);

2 个答案:

答案 0 :(得分:8)

已接受答案的问题

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

<块引用>

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

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

<块引用>

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

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

<块引用>

如果您想在支持斜杠的情况下向 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 中使用斜线命令仍然不适合您,即使在仔细检查这两个潜在问题后,您可能需要考虑实现斜线命令的替代方法(并且稍微简单一些):{ {3}} 模块。

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

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 本身那样可靠地保持最新状态。但是,如果您无法弄清楚如何在 discord.js 本身中使用斜杠命令,这肯定会有所帮助。

如果您在这方面需要更多帮助或想要查看任一方法的更完整实现,discord-slash-commands-client 有几个很好的工作示例,可帮助您使 Slash Commands 代码在您的机器人上正常运行。

答案 1 :(得分:-2)

这个答案已经过时了!

当它被接受时,Discord 还没有引入真正的 /slash 命令。因此,如果您想集成或迁移到最新版本的 Discord.js,请使用下面的答案

嗯,答案很简单。根据 Discord.js 文档,类 Client 没有 api 属性。这就是您遇到 undefined 错误的原因。

您正在查看的教程似乎有点过时,或者可能是导师手动添加了此属性,因为 Discord.js 具有相关类,例如 ApplicationClientApplication 但我仍然不也看不到 api 属性。

如果您正在寻找好的指南,我可能会从官方 Discord 推荐页面向您推荐this one

如果您想在支持斜杠的 Discord 机器人上执行命令,只需在 ready 阶段之后添加以下代码。

const prefix = '/'

client.on('message', message => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'ping') {
        message.channel.send('Pong.');
    }
})
相关问题