如何在discord.js中实现过滤数组中非服务器成员的功能?
解决Discord.js过滤非服务器成员的问题
问题分析
- 第一种方案崩溃原因:
message.guild.members.fetch(obj.id)请求非成员ID时会直接抛出Unknown Member错误,未添加错误捕获逻辑导致机器人崩溃。 - 第二种方案卡住原因:在过滤函数中每次都重新调用
message.guild.members.fetch()获取全量成员列表,数组每一个元素都会触发一次请求,大量重复请求导致长时间等待。
可行实现方法
方案一:一次性获取成员ID集合(推荐,高效)
先一次性拉取服务器所有成员的ID并存入Set,之后直接用Set快速判断用户是否为成员,避免重复请求:
// 一次性获取服务器所有成员的ID集合 const memberIds = new Set((await message.guild.members.fetch()).map(member => member.id)); // 过滤用户数组,仅保留服务器成员 const filteredUsers = userArray.filter(obj => memberIds.has(obj.id));
方案二:给原方案添加错误捕获(适合小批量用户)
如果用户数组规模较小,可以给第一种方案添加try/catch捕获错误,处理非成员的情况:
const serverMemberFilter = async obj => { try { await message.guild.members.fetch(obj.id); return true; } catch (error) { // 捕获非成员错误,返回false return false; } }; // 注意:filter不支持异步函数,需用Promise.all处理 const filteredResults = await Promise.all(userArray.map(serverMemberFilter)); const filteredUsers = userArray.filter((_, index) => filteredResults[index]);
内容的提问来源于stack exchange,提问作者liam
相关产品推荐
相关产品推荐

