discord.js v13开发反链接脏话功能时报permissions为null的TypeError
问题根因定位
- 报错核心原因是
message.member为null,该情况通常出现在消息来自服务器外的私聊(DM)场景时,私聊场景不存在服务器成员属性,自然没有permissions字段 - discord.js v13 已废弃旧的
message事件,替换为messageCreate事件,继续使用旧事件会导致属性读取异常 - 未配置v13强制要求的网关意图(Intents),必须手动开启
GUILDS、GUILD_MESSAGES、GUILD_MEMBERS三个意图才能正常读取成员、消息、服务器相关属性 - 代码存在笔误,静音逻辑里的
message.guildMember是错误写法,正确属性为message.member,运行到静音逻辑时会触发二次报错
修复步骤
- 先在事件逻辑最前面增加无效消息过滤,直接跳过不需要处理的场景
- 将事件监听从
client.on('message'替换为v13适配的messageCreate事件 - 检查客户端初始化代码,配置必要的网关意图,同时需要在Discord开发者后台的Bot设置页面,开启 Privileged Gateway Intents 下的
Server Members Intent开关 - 修正代码里的
guildMember笔误为member
客户端初始化参考配置:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS ] });
修复后完整业务代码
const fs = require('fs') module.exports = (client) => { // 替换为v13支持的messageCreate事件 client.on('messageCreate', async message => { // 前置过滤无效消息:机器人消息、非服务器消息、无成员属性的消息直接跳过 if (message.author.bot || !message.guild || !message.member) return; if(message.member.permissions.has('MANAGE_MESSAGES')) return let warnings = {} let warnCount = 3 let warnCount2 = 5 let warnCount3 = 7 warnings = fs.readFileSync('./db.json', 'utf8'); warnings = JSON.parse(warnings) if(message.content.toLowerCase().includes('fuk')) { await message.delete() await message.channel.send(`${message.author.username} was warned for posting links`) if(!warnings[message.author.id]) warnings[message.author.id] = { warnings: 0 } warnings[message.author.id].warnings += 1 console.log(`${message.author.tag} was warned in ${message.guild.name}. Warnings: ${warnings[message.author.id].warnings}`) if(warnings[message.author.id].warnings == warnCount){ let muterole = message.guild.roles.cache.find(role => role.name === 'Muted') if(!muterole) return message.channel.send('cant mute because theres no roles such as "Muted"') // 修复笔误:guildMember改为member await message.member.roles.add(muterole) await message.channel.send(`${message.author.tag} was muted for 1m. Reason: Unknown Link`) setTimeout(async() => { await message.member.roles.remove(muterole) await message.channel.send(`${message.author.tag} was unmuted`) }, 60000) } if(warnings[message.author.id].warnings == warnCount2){ let muterole = message.guild.roles.cache.find(role => role.name === 'Muted') if(!muterole) return message.channel.send('cant mute because theres no roles such as "Muted"') // 修复笔误:guildMember改为member await message.member.roles.add(muterole) await message.channel.send(`${message.author.tag} was muted for 1h. Reason: Unknown Link`) setTimeout(async() => { await message.member.roles.remove(muterole) await message.channel.send(`${message.author.tag} was unmuted`) }, 3600000) } fs.writeFileSync('./db.json', JSON.stringify(warnings)); } }) }
内容的提问来源于stack exchange,提问作者Lokry
相关产品推荐
相关产品推荐

