Почему не вызывается «if (member)»?

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

В настоящее время создается проверка, чтобы узнать, принадлежит ли введенный идентификатор пользователю, но похоже, что «member» не существует. Рассматриваемый код:

 client.on("message", (msg) => {
    if (msg.author.bot) return;
    if (msg.content.startsWith(PREFIX)) {
        const [CMD_NAME, ...args] = msg.content
            .trim()
            .substring(PREFIX.length)
            .split(/s /);
        if (CMD_NAME == "kick") {
            if (args.length === 0) return msg.channel.send("Invalid user.");
            const member = msg.guild.members.cache.get(args[0]);
            if (member) {
                member
                    .kick()
                    .then((member) => msg.channel.send(`${member} was kicked.`))
                    .catch((err) => msg.channel.send(`I lack permissions to kick ${member.user}`));
            } else {
                msg.channel.send("User not found.");
            }
        }    
    }
});
       
 

Спасибо за помощь.

Комментарии:

1. Звучит как member falsey

2. Ну, очевидно cache.get(args[0]) , не возвращает то, что вы ожидаете. Проверьте содержимое args[0] , а также содержимое member в этом месте

3. Извлеките элемент. Не полагайтесь на кеш

Ответ №1:

Прежде всего, я бы рекомендовал использовать fetch (https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=fetch ) вместо get, потому что пользователь, возможно, не кэшируется. Для получения пользователя также fetch требуется Snowflake (идентификатор пользователя), но вы, вероятно, вводите не идентификатор пользователя, а скорее упоминание, которое имеет формат ‘<@userid>’ или ‘!@userid’, поэтому его необходимо проанализировать, прежде чем вы сможете вызвать функцию со snowflake.

Но в вашем случае я бы посоветовал просто использовать встроенные функции для упоминаний.

 const member = msg.mentions.users.first();
 

Комментарии:

1. Просто хочу прокомментировать ваше первое утверждение: прежде всего, .get() это задокументировано в документе Collection : https://discord.js.org/#/docs/collection/master/class/Collection?scrollTo=get . Во-вторых, выборка не всегда является самым надежным источником, так как в больших гильдиях это может привести к тайм-ауту вашего бота и может привести к его сбою.

2. @Bqre Как выборка 1 пользователя приведет к сбою бота? Да, это приведет к сбою, если вы получите всю гильдию…

3. @Logan Devine В довольно больших гильдиях это возможно. Это не слишком распространено, но мне это приходило в голову один или два раза. С тех пор я больше не рискую, учитывая, что большинство пользователей discord уже кэшированы.

4. @Bqre С последними обновлениями API кэшируется очень мало участников.