Discord.js中client.on('message')无法读取指定频道消息问题
问题分析与修复方案
核心原因:事件名称过时 + 缺少Bot登录逻辑
你的代码未执行的直接原因有两个:
- discord.js v14 已弃用
message事件,改用messageCreate事件监听消息,旧事件名不会触发任何回调。 - 代码末尾没有调用
client.login(),Bot根本没登录到Discord服务器,自然无法接收任何事件。
修复后的完整代码
const Discord = require('discord.js'); const fs = require('fs'); const client = new Discord.Client({ intents: [ Discord.GatewayIntentBits.Guilds, Discord.GatewayIntentBits.GuildMembers, Discord.GatewayIntentBits.MessageContent, Discord.GatewayIntentBits.GuildPresences, ], }); const validStringsPath = 'valid_strings.txt'; const TARGET_CHANNEL_ID = '1144023627419897937'; const ROLE_NAME = 'reseller'; // 初始化时读取一次有效字符串,避免重复IO let validStrings = []; try { validStrings = fs.readFileSync(validStringsPath, 'utf8') .split('\n') .map(str => str.trim()) .filter(str => str); // 过滤空行 } catch (err) { console.error('读取有效字符串文件失败:', err); } client.once('ready', () => { console.log(`Logged in as ${client.user.tag}`); }); client.on('messageCreate', async (message) => { // 忽略Bot自身消息 if (message.author.bot) return; // 检查目标频道 if (message.channel.id !== TARGET_CHANNEL_ID) return; const content = message.content.trim(); try { if (validStrings.includes(content)) { const role = message.guild.roles.cache.find(r => r.name === ROLE_NAME); if (!role) { await message.channel.send("指定的角色在服务器中不存在。"); await message.delete(); return; } // 分配角色 await message.member.roles.add(role); // 更新有效字符串列表并写入文件 validStrings = validStrings.filter(str => str !== content); fs.writeFileSync(validStringsPath, validStrings.join('\n')); console.log(`已为用户${message.author.tag}分配角色,并移除密钥: ${content}`); } else { // 发送错误私信 await message.author.send('Wrong key'); } // 删除用户消息 await message.delete(); } catch (err) { console.error('处理消息时出错:', err); // 出错时尝试删除消息 if (!message.deleted) await message.delete().catch(() => {}); } }); // 替换成你的Bot令牌 client.login('YOUR_BOT_TOKEN_HERE');
额外注意事项
- 权限检查:确保Bot拥有「管理角色」「发送消息」「删除消息」「读取消息历史」的权限,否则会出现操作失败。
- 文件权限:确保Node.js进程有读写
valid_strings.txt的权限,避免文件操作失败。 - 私信限制:如果用户关闭了陌生人私信,发送私信会失败,可改为在频道内发送提示(可选)。
- 密钥唯一性:当前逻辑会移除已使用的密钥,确保每个密钥只能用一次,符合需求。
内容的提问来源于stack exchange,提问作者Wriikx
相关产品推荐
相关产品推荐

