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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:10:49