You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:21:05