discord.js中guildMemberAdd事件失效及报错修复求助
修复discord.js guildMemberAdd事件故障方案
核心错误分析
报错信息显示CombinedPropertyError,根源是EmbedBuilder.setFields方法参数不合法——你传入了{text: "Joined"},但discord.js要求每个字段必须包含name和value两个必填属性,缺少这两项导致验证失败。除此之外代码还有几处逻辑和拼写问题,以下是完整修复步骤:
具体修复点
1. 修正setFields参数格式
删除错误的.setFields({text: "Joined"}),如果需要添加字段,必须按{name: "字段名称", value: "字段内容"}的格式传入,示例:
.setFields({ name: "状态", value: "已加入服务器" })
2. 修复角色赋值逻辑
原代码中assigneRole的赋值逻辑错误,没有将获取到的角色对象赋值给变量,正确写法:
let assigneRole = guildRoles.get(guildConfig.memberRole);
3. 修正拼写错误
变量名welcomChannel拼写错误,统一改为welcomeChannel,同时确保配置文件中的对应键名一致,避免找不到频道。
4. 修正消息发送参数
发送Embed时,discord.js要求参数为embeds(复数形式),而非Embed,正确写法:
welcomeChannel.send({ embeds: [embed] });
5. 优化时间判断逻辑
原代码的三个if会导致颜色被重复覆盖,改为else if提升执行效率:
if(accountCreation >= dayAgo){ color = "#e21e1e" } else if(accountCreation >= weekAgo){ color = "#e24d1c" } else if(accountCreation >= monthAgo){ color = "#e2bb1e" }
完整修复后的代码
const { GuildMember, EmbedBuilder } = require("discord.js"); const moment = require("moment"); module.exports = { name: "guildMemberAdd", /** * @param {GuildMember} member */ async execute(member, client) { const guildConfig = client.guildConfig.get(member.guild.id); if (!guildConfig) return; const guildRoles = member.guild.roles.cache; let assigneRole = guildRoles.get(guildConfig.memberRole); if (!assigneRole) { assigneRole = "未配置"; } else { await member.roles.add(assigneRole) .catch(() => { assigneRole = "因角色层级失败" }); } const welcomeChannel = (await member.guild.channels.fetch()).get(guildConfig.welcomeChannel); if (!welcomeChannel) return; let color = "#74e21e"; const accountCreation = parseInt(member.user.createdTimestamp / 1000); const joiningTime = parseInt(member.joinedAt / 1000); const monthAgo = moment().subtract(2, "month").unix(); const weekAgo = moment().subtract(2, "weeks").unix(); const dayAgo = moment().subtract(2, "days").unix(); if (accountCreation >= dayAgo) { color = "#e21e1e"; } else if (accountCreation >= weekAgo) { color = "#e24d1c"; } else if (accountCreation >= monthAgo) { color = "#e2bb1e"; } const embed = new EmbedBuilder() .setAuthor({ name: `${member.user.tag}| ${member.id}`, iconURL: member.displayAvatarURL({ dynamic: true }) }) .setColor(color) .setThumbnail(member.user.displayAvatarURL({ dynamic: true, size: 256 })) .setDescription([ `- 用户: ${member.user}`, `- 分配角色: ${assigneRole}`, `- 账号创建时间: <t:${accountCreation}:D> | <t:${accountCreation}:R>`, `- 加入服务器时间: <t:${joiningTime}:D> | <t:${joiningTime}:R>` ].join("\n")) // 如需添加字段请取消注释并修改内容 // .setFields({ name: "状态", value: "已加入服务器" }) .setTimestamp(); welcomeChannel.send({ embeds: [embed] }); } };
额外注意事项
- 确保机器人拥有管理角色和发送消息的权限
- 检查
guildConfig中的memberRole和welcomeChannel是否配置了正确的ID - 在Discord开发者门户的机器人设置中,开启服务器成员特权 intents
内容的提问来源于stack exchange,提问作者ReQ
相关产品推荐
相关产品推荐

