【问题标题】:Discord.js Ban command issuesDiscord.js 禁止命令问题
【发布时间】:2020-06-16 06:48:17
【问题描述】:

我正在尝试修复我今天遇到的一个错误,错误是这样的:

C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\commands\moderation\ban.js:15 让 { 用户 } = message.mentions.members.first() || message.guild.members.get(args[0]); ^

TypeError: 无法解构 'user' 的属性 '(message.mentions.members.first(...) || message.guild.members.get(...))' 因为它是未定义的。 在 Object.run (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\commands\moderation\ban.js:15:11) 在客户端。 (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\index.js:36:34) 在 Client.emit (events.js:323:22) 在 MessageCreateHandler.handle (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34) 在 WebSocketPacketManager.handle (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:108:65) 在 WebSocketConnection.onPacket (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:336:35) 在 WebSocketConnection.onMessage (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:299:17) 在 WebSocket.onMessage (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\ws\lib\event-target.js:120:16) 在 WebSocket.emit (events.js:311:20) 在 Receiver.receiverOnMessage (C:\Users\nalfo\OneDrive\Desktop\Discord Bot\NetSync\node_modules\ws\lib\websocket.js:789:20)

它之前工作得很好,不知道出了什么问题。这是我的模块导出。

module.exports = {
    name: "ban",
    category: "moderation",
    description: "Bans the mentioned user.",
    usage: "<imputs>",
    run: (client, message, args) => {
    let { user } = message.mentions.members.first() || message.guild.members.get(args[0]);

    if(!message.member.hasPermission("BAN_MEMBERS")){
        message.channel.send(permission);
    } else {
        if(!user)
            return message.channel.send(novalidmember);
        if(!user.bannable) 
            return message.channel.send("I cannot ban this user! Do they have a higher role? Do I have ban permissions?");

        let reason = args.slice(1).join(' ');
        if(!reason) reason = "No reason provided";

        user.ban({
            reason: `${reason}`
        })

        const embed = new Discord.RichEmbed()
         The embed is hidden.

        let logchannel = message.guild.channels.find(x => x.name === `logs`);


        if (!logchannel){
            Sends a message to the channel.
            Logs the ban in a file.
        } else {
            Sends a message to the channel.
            Logs ban in the log channel.
          }


    }
}
}

我隐藏了一些代码,因为它并不重要。但我仍然不确定整个命令有什么问题。

【问题讨论】:

    标签: javascript discord.js


    【解决方案1】:

    这里的错误是提到在下面一行你不能"destructure"message.mentions.members.first() || message.guild.members.get(args[0])的结果,因为结果是undefined

    let { user } = message.mentions.members.first() || message.guild.members.get(args[0]);
    

    message.mentions.members.first()message.guild.members.get(args[0])的结果有可能是undefined吗?在尝试从他们返回的对象中获取用户密钥之前,我没有看到您检查 undefined

    这是我要做的,而不是在分配 user 后检查虚假值:替换

    if (!user)
        return message.channel.send(novalidmember);
    

    在文件中更进一步(在分配user 之前),如下所示:

    if (message.mentions.members.first() == undefined || message.guild.members.get(args[0]) == undefined)
    {
        return message.channel.send(novalidmember);
    }
    

    【讨论】:

    • 对不起,我没听懂你的意思?检查它是否未定义是否意味着这样:if(!user) return message.channel.send(novalidmember);
    • 抱歉,如果我的回答不够清楚 - 在尝试将它们分配给 user 之前,您应该检查 message.mentions.members.first()message.guild.members.get(args[0]) 是否为空。之所以会出现这个问题,是因为 javascript 不知道应该用什么来生成 user,因为这两个语句都返回了 undefined
    • @PrinceBunBun981 当您执行let { user } = ... 时,您是在告诉它您想要拉出对象的用户元素,因此let { user } = message.mentions.members.first() 在功能上与let user = message.mentions.members.first().user 相同。问题是,memeber.user 在 Discord.js 中是一个真实的东西,但它与公会无关,因此所有公会功能(例如可禁止)都不存在于该级别,因此是未定义的。
    • @PrinceBunBun981 我已经更新了我的答案,解释说(希望)更有意义 - 我建议您阅读“解构”是什么,以及为什么 JS 对您的说明不满意给它...
    • @PrinceBunBun981 语法之所以存在,是因为顺便可以一次拉出多个属性。 let {id, name, displayname} = message.mentions.members.first(); 将为您提供 3 个变量,包括 id、name 和 display name。
    猜你喜欢
    • 2021-07-27
    • 2021-06-01
    • 2020-11-18
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多