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
相关产品推荐
相关产品推荐

