Discord.js |无法读取未定义的属性“ displayName”

时间:2020-02-06 13:06:54

标签: discord discord.js

我正在为一个朋友制作一个不和谐的机器人,并且一切正常,直到我尝试发出unban命令为止。当我试图解除某人的禁令时,它不起作用。然后我看着错误。它显示:

TypeError:无法读取未定义的属性“ displayName” 在C:\ Users \ user \ folder_name \ commands \ unban.js:37:67 在processTicksAndRejections(内部/流程/task_queues.js:97:5) 未处理的承诺拒绝:TypeError:无法读取未定义的属性'displayName' 在C:\ Users \ user \ folder_name \ commands \ unban.js:37:67 在processTicksAndRejections(internal / process / task_queues.js:97:5)

这是我的代码

const Discord = require('discord.js');

module.exports = {
    name: 'unban',
    description: 'unban user',
    aliases: [],
    cooldown: 0,
    args: true,
    usage: '<mention> [reason]',
    guildOnly: true,
    execute(message, args, client) {
        console.log(message.content);
        const embedMsg = new Discord.RichEmbed()
            .setColor('#0000ff')
            .setAuthor(message.author.username, message.author.displayAvatarURL)
            .setThumbnail(message.author.displayAvatarURL)
            .setTimestamp()
            .setFooter('botname', client.user.displayAvatarURL);

        let member = message.mentions.members.first();

        if (!message.member.hasPermission('BAN_MEMBERS')) {
            embedMsg.setDescription(`You don't have permission to unban!`);
            return message.channel.send(embedMsg);
        }

        if (!args.length >= 1) {
            embedMsg.setDescription('^unban takes at least one argument! the proper usage is ^unban <mention> [reason]');
            message.channel.send(embedMsg);
        }

        if (args.length < 2) {
            message.guild.unban(member).then(() => {
                embedMsg.setDescription(`${member.displayName} has been succesfully unbanned`);
                return message.channel.send(embedMsg);
            }).catch((err) => {
                embedMsg.setDescription(`Could not unban ${member.displayName}`);
                console.log(err);
                return message.channel.send(embedMsg);
            });
            return;
        }

        newargs = "";
        for (var i = 1; i < args.length; i++) {
            newargs += (args[i] + " ");
        }

        message.guild.unban(member).then(() => {
            embedMsg.setDescription(`${member.displayName} has been succesfully unbanned for reason ${newargs}`);
            return message.channel.send(embedMsg);
        }).catch((err) => {
            embedMsg.setDescription(`Could not unban ${member.displayName}`);
            console.log(err);
            return message.channel.send(embedMsg);
        });
        return;
    }
}

有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

Unbun方法返回user承诺,因此用户没有属性displayName,则需要使用.username

您可以使用user.id进行禁止,所以正确的方法是let member = message.mentions.members.first() || args[0]

此检查做错了,因为它没有停止执行代码

if (!args.length < 2) {
    embedMsg.setDescription('^unban takes at least one argument! the proper usage is ^unban <mention> [reason]');
    return message.channel.send(embedMsg);
}

Amm,零件代码在做什么?为什么要重复?

if (args.length < 2) {
    message.guild.unban(member)
        .then(() => {
            embedMsg.setDescription(`${member.username} has been succesfully unbanned`);
            return message.channel.send(embedMsg);
        })
        .catch((err) => {
            embedMsg.setDescription(`Could not unban ${member.username}`);
            console.log(err);
            return message.channel.send(embedMsg);
        });
    return;
}

修改后的代码

const Discord = require('discord.js');
module.exports = {
    name: 'unban',
    description: 'unban user',
    aliases: [],
    cooldown: 0,
    args: true,
    usage: '<mention> [reason]',
    guildOnly: true,
    execute(message, args, client) {
        const embedMsg = new Discord.RichEmbed()
            .setColor('#0000ff')
            .setAuthor(message.author.username, message.author.displayAvatarURL)
            .setThumbnail(message.author.displayAvatarURL)
            .setTimestamp()
            .setFooter('botname', client.user.displayAvatarURL);
        let member = message.mentions.members.first() || args[0]
        if (!message.member.hasPermission('BAN_MEMBERS')) {
            embedMsg.setDescription(`You don't have permission to unban!`);
            return message.channel.send(embedMsg);
        }
        if (!args.length < 2) {
            embedMsg.setDescription('^unban takes at least one argument! the proper usage is ^unban <mention> [reason]');
            return message.channel.send(embedMsg);
        }
        let newargs = args.splice(1,args.length).join(' ')

        message.guild.unban(member)
            .then(() => {
                embedMsg.setDescription(`${member.username} has been succesfully unbanned for reason ${newargs}`);
                return message.channel.send(embedMsg);
            })
            .catch((err) => {
                embedMsg.setDescription(`Could not unban ${member.username}`);
                console.log(err);
                return message.channel.send(embedMsg);
            });
    }
}

答案 1 :(得分:0)

在discord.js的官方文档中说,unban方法返回成员对象https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=unban

之所以说“未定义”的原因是因为您要访问的成员对象不在服务器/行会中。因此,因此您需要添加对方法返回的成员对象的引用:

message.guild.unban('some user ID').then((member) => {
   embedMsg.setDescription(`${member.username} has been succesfully unbanned for reason ${newargs}`);
            return message.channel.send(embedMsg);
}