discord.js Диспетчер ролей не показывает роль

#javascript #node.js #discord.js

Вопрос:

Я хотел проверить, есть ли у пользователя роль или нет, с помощью простого

 let author = message.author.id
let guild = await client.guilds.fetch("guild")
let member = await guild.members.fetch(author)

member.roles.cache.has("role")
 

Однако иногда он возвращается false , даже если я только что дал этому участнику роль. И он все равно возвращается true после того, как я удаляю их роль. Он снова заработает только после перезагрузки бота.

Это ошибка или мне нужно снова кэшировать участника целиком? Если да, то как мне это сделать, чтобы сделать это быстро?

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

1. Я вроде как не понял, что вы пытались сделать, но я рекомендую вам использовать just message.member insteaf of let author = message.author.id; let member = await guild.members.fetch(author) , потому что это то же самое, но ваш код будет выглядеть лучше!

2. @MegaMix_Craft message.member работает только внутри сервера гильдии, я хотел обработать команду в DM, одновременно проверяя роли в конкретной гильдии.

Ответ №1:

Похоже, вы столкнулись с проблемой кэша…

Я на самом деле не разрабатывал с использованием discord api, однако, читая их документацию, у меня создается впечатление, что вы должны использовать либо:

 await guild.members.fetch({ user: author/id, force: true });
 

Флаг force указывает не использовать кэш в запросе — подробнее здесь . Очевидно, что при отключении кэша может возникнуть снижение производительности.

Кроме того, в документации указан message.member объект, который, возможно, уже выполняет это за вас, экономя один или два запроса.

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

1. message.member работает только внутри сервера гильдии, я хотел обработать команду в DM, одновременно проверяя роли в конкретной гильдии.

2. @Prism Похоже, что это проблема с кешем, хотя и с противоречивыми результатами. В этом случае я бы попробовал флаг «force».

3. Флаг Force, похоже, помогает решить проблему, не удалось увидеть никакой репликации. Приветствия!