Node.js开发Discord Bot报错:无法读取Intents.FLAGS属性
问题:Discord Bot 运行时抛出TypeError,无法读取undefined的FLAGS属性
执行node bot.js测试班级奖学金积分统计Bot时,出现以下错误:
name@name-machine discord % node bot.js /Applications/XAMPP/xamppfiles/htdocs/discord/bot.js:5 Intents.FLAGS.GUILDS, ^ TypeError: Cannot read properties of undefined (reading 'FLAGS') at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/discord/bot.js:5:17) at Module._compile (node:internal/modules/cjs/loader:1376:14) at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) at Module._load (node:internal/modules/cjs/loader:1023:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12) at node:internal/main/run_main_module:28:49 Node.js v20.11.1
Bot代码如下(TOKEN为Discord机器人令牌):
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES ] }); client.login('TOKEN'); const points = {}; client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('message', message => { if (message.author.bot) { return; } // Ignore messages from bots const args = message.content.trim().split(/ +/); const command = args.shift().toLowerCase(); if (command.startsWith('/')) { const name = command.substring(1); if (!points.hasOwnProperty(name)) { points[name] = 0; message.channel.send(`Added ${name} to the scholarship points list.`); } else { const amount = parseInt(args[0]); if (!isNaN(amount)) { points[name] += amount; message.channel.send(`Added ${amount} points to ${name}. Total points: ${points[name]}`); } else { message.channel.send('Invalid points value. Please provide a valid number.'); } } } else if (command === '/points') { let leaderboard = 'Scholarship Points Leaderboard:\n'; Object.keys(points).forEach(name => { leaderboard += `${name}: ${points[name]} points\n`; }); message.channel.send(leaderboard); } });
解决方案
错误根源是discord.js版本不兼容:当前安装的是v14版本,但代码采用v13及更早版本的写法,v14对Intents结构和事件名称做了修改。
1. 修正Intents的导入与使用
v14中不再使用Intents.FLAGS,需要导入IntentsBitField,并通过IntentsBitField.Flags调用权限:
const { Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages ] });
2. 替换message事件为messageCreate
v14已移除message事件,改用messageCreate监听消息:
client.on('messageCreate', message => { // 原消息处理逻辑不变 });
3. 修复命令判断逻辑
原代码中else if (command === '/points')永远不会触发,因为前面的if (command.startsWith('/'))已拦截所有以/开头的命令,需调整顺序:
if (command === '/points') { let leaderboard = '奖学金积分排行榜:\n'; Object.keys(points).forEach(name => { leaderboard += `${name}: ${points[name]} 分\n`; }); message.channel.send(leaderboard); } else if (command.startsWith('/')) { const name = command.substring(1); // 原添加/修改积分逻辑不变 }
修改后的完整代码
const { Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages ] }); const points = {}; client.on('ready', () => { console.log(`已登录为 ${client.user.tag}!`); }); client.on('messageCreate', message => { if (message.author.bot) return; // 忽略机器人消息 const args = message.content.trim().split(/ +/); const command = args.shift().toLowerCase(); if (command === '/points') { let leaderboard = '奖学金积分排行榜:\n'; Object.keys(points).forEach(name => { leaderboard += `${name}: ${points[name]} 分\n`; }); message.channel.send(leaderboard); } else if (command.startsWith('/')) { const name = command.substring(1); if (!points.hasOwnProperty(name)) { points[name] = 0; message.channel.send(`已将 ${name} 添加到积分列表。`); } else { const amount = parseInt(args[0]); if (!isNaN(amount)) { points[name] += amount; message.channel.send(`已为 ${name} 增加 ${amount} 分,当前总积分: ${points[name]}`); } else { message.channel.send('无效的积分值,请输入合法数字。'); } } } }); client.login('TOKEN');
内容的提问来源于stack exchange,提问作者uzziclip
相关产品推荐
相关产品推荐

