You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:33:26