Discord.js AFK功能报错:message未定义 求修复方案
问题分析与修复方案
核心问题
你碰到的ReferenceError: message未定义,根源是处理用户提及的代码块写在了execute函数外面——message、guild这些变量只有在execute函数的作用域里才有效,函数外根本访问不到这些参数。
另外代码里还有几个小问题:
- 写错了对象名,应该是
message.mentions而非mentions data.save()是异步操作,没加await可能导致数据库操作未完成就结束- 回调式的
afkModel.findOne和代码整体的async风格不统一,容易出问题 - 存在重复的
if(!data) return冗余判断
修正后的完整代码
const afkModel = require("../../Models/Afk"); const { Message } = require('discord.js') module.exports = { name: "messageCreate", async execute(message, client) { // 忽略机器人消息和非服务器内的消息 if (message.author.bot || !message.guild) return; // 处理发消息的用户:如果之前设置了AFK,自动取消 let senderData = await afkModel.findOne({ Guild: message.guild.id, UserID: message.author.id }); if (senderData && senderData.Afk) { senderData.Afk = false; await senderData.save(); // 异步操作加await确保完成 } // 处理消息里提及的用户:检查是否AFK并提示 const taggedMembers = message.mentions.users.map(user => user.id); if (taggedMembers.length === 0) return; for (const userId of taggedMembers) { const taggedData = await afkModel.findOne({ Guild: message.guild.id, UserID: userId }); if (taggedData && taggedData.Afk) { await message.reply(`该用户当前处于AFK状态。\n原因:${taggedData.Reason || "未提供原因。"}`); } } } };
关键修改说明
- 把所有业务逻辑(包括处理提及用户的代码)都移到
execute函数内部,确保能正常访问message等参数 - 把回调式的
findOne改成async/await写法,和代码整体风格统一,可读性更高 - 给
save()、reply()这些异步操作加await,保证操作顺序和完整性 - 修正
mentions为message.mentions,正确获取消息里的提及用户 - 删掉冗余的重复判断,精简代码逻辑
内容的提问来源于stack exchange,提问作者user21372700
相关产品推荐
相关产品推荐

