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

Discord.js实现生日自动授身份组到期移除功能时报错求助

问题原因

你的错误核心是操作的对象不对:你遍历的dbServer.members里的member是数据库存储的普通对象,不是Discord.js封装的GuildMember实例,本身没有roles属性,所以调用member.roles.add/remove的时候就会报roles是undefined的错误。
另外你的代码里还有多个逻辑错误,会导致后续其它问题。

具体修复点
  • 先从当前服务器实例中拉取真实的Discord成员实例再操作角色
  • 删除重复的、硬编码占位符的服务器/角色获取逻辑,复用外层已经拿到的服务器和角色对象
  • 修正生日判断逻辑,避免出现生日过后不删除角色的问题
  • 修正定时任务频率,避免每秒执行触发Discord速率限制、重复发送祝福消息
  • 修正频道创建、消息发送的参数写法,适配Discord.js版本要求
修复后代码
const { Client, MessageEmbed } = require('discord.js')
var cron = require('node-cron');
const { collection } = require('../models/Server.js');
const ServerRepository = require("../repositories/server-repository.js");

module.exports = async(client) => {
    await client.mongoose.init()
    // 定时任务改为每天凌晨0点执行一次,不需要每秒跑
    cron.schedule('0 0 0 * * *', async () => {
        const date = new Date();
        const currentMonth = date.getMonth() + 1;
        const currentDay = date.getDate();
        const birthdayRoleId = "881403012784992266"; // 你的生日角色ID

        client.guilds.cache.forEach(async(guild) => {
            const dbServer = await ServerRepository.findOrCreate(guild);
            let birthdayChannel = guild.channels.cache.find(channel => channel.name == '🎂・doğum-günleri');
            // 不存在就创建文本频道
            if (!birthdayChannel) {
                birthdayChannel = await guild.channels.create("🎂・doğum-günleri", { type: 'GUILD_TEXT' });
            }
            // 获取服务器的生日角色
            const birthdayRole = guild.roles.cache.get(birthdayRoleId);
            if (!birthdayRole) return console.log(`服务器${guild.id}未找到生日角色`);

            // 遍历数据库中的成员
            for (const member of dbServer.members) {
                const month = member.birthday.getMonth() + 1;
                const day = member.birthday.getDate();
                // 拉取真实的Discord成员实例
                const guildMember = await guild.members.fetch(member.discord_id).catch(err => console.log(`找不到成员${member.discord_id}:`, err));
                if (!guildMember) continue;

                if (month === currentMonth && day === currentDay) {
                    const dogumgunumesaji = new MessageEmbed()
                        .setColor('#e91e63')
                        .setTitle(`🎂 Doğum Gününüz Kutlu Olsun!`)
                        .setURL('https://www.duslergezegeni.com/')
                        .setAuthor('Düşler Gezegeni', 'https://i.imgur.com/xvwKU93.png', 'https://www.duslergezegeni.com')
                        .setDescription(`Merhaba Sn. <@${member.discord_id}>,\n **Düşler Gezegeni** yönetim kadrosu olarak doğum gününüzü en içten dileklerimizle kutluyoruz. Nice geçecek mutlu seneleriniz, nice huzur dolu hatıralarınız olsun. Hep beraber hayallerle dolu geleceğe.\n*Saygılarımızla,*\n***Düşler Gezegeni***\n`)
                        .setImage('https://i.imgur.com/Cs2guE7.jpg')
                        .setThumbnail('https://i.imgur.com/xvwKU93.png')
                        .setTimestamp()
                        .setFooter('Düşler Gezegeni | www.duslergezegeni.com', 'https://i.imgur.com/xvwKU93.png');
                    // 修正embed发送写法
                    await birthdayChannel.send({ embeds: [dogumgunumesaji] });
                    // 添加角色
                    await guildMember.roles.add(birthdayRole).catch(console.error);
                } else {
                    // 不是今日生日就移除角色
                    await guildMember.roles.remove(birthdayRole).catch(console.error);
                }
            }
        });
    }, {
        scheduled: true,
        timezone: "Europe/Istanbul"
    });
}
额外注意事项
  • 要确保机器人的角色权限在生日角色之上,否则无法给成员添加/移除生日角色
  • 要给机器人开通管理角色、发送消息、嵌入链接的权限

内容的提问来源于stack exchange,提问作者Umutcan Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:03