【问题标题】:Slash Commands - Discord.js斜线命令 - Discord.js
【发布时间】:2021-06-11 15:52:19
【问题描述】:

我在尝试运行时遇到错误: (节点: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);

【问题讨论】:

  • 你试过client.cache.user.id吗?
  • 是的,我有,它仍然给我同样的错误。

标签: javascript node.js discord discord.js


【解决方案1】:

已接受答案的问题

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

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

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

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

OP 所使用的教程实际上比已接受的答案发布和使用的教程更新。 ApplicationClientApplication 类根本不相关,因为它们都不能访问斜杠命令。数百个不同的教程也没有各自实现自己的 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 属性不是主要问题,这让我们知道真正的主要问题是什么。

那么真正的问题是什么?

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

  1. Discord.js 版本。早于v12 的版本不存在api 属性。确保您使用的是最新版本的 discord.js。这很可能是问题的原因。
  2. 缺少访问权限。在生成邀请链接时,您需要为您的机器人提供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 命令代码在您的机器人上正常工作。

【讨论】:

    【解决方案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.');
        }
    })
    

    【讨论】:

    • 应该有一个,因为 youtube 上的其他带有 Slash 命令教程的视频都包含它。它应该在 v12 中?
    • @bananapie。不是它不应该。实际上,Discord.js 库的更新频率更高,youtube 创作者会用他们的视频来更新。我已经在我的答案中放置了 Discord.js 社区制作的相关指南,所以,请随意使用,如果你觉得我的答案有用,请点赞,或者接受它作为答案。
    • 还有一个问题,现在有没有办法做斜线命令?我必须切换回另一个前缀吗?
    • @bananapie 这与使用/commands 完全无关。随意使用您想要的任何前缀,甚至可以在没有它们的情况下创建命令。看看这个part of code in suggested tutorial。请不要一直回答这个问题。
    • 这只是创建一个以/ 开头的命令,但不会创建true slash commands
    猜你喜欢
    • 2022-01-25
    • 2021-11-17
    • 2021-08-17
    • 2022-01-14
    • 2022-01-15
    • 2021-11-12
    • 2021-08-28
    • 2021-09-12
    • 2021-12-22
    相关资源
    最近更新 更多