(节点:4044)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“缓存”

Posted

技术标签:

【中文标题】(节点:4044)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“缓存”【英文标题】:(node:4044) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'cache' of undefined 【发布时间】:2021-08-31 14:05:42 【问题描述】:

我在这里有点需要帮助,老实说,我不确定我哪里出错了,这是完整的代码。我是个新手,只是想在消息中带回提及用户和原因,而不是对这些信息做任何事情。

const  client, MessageEmbed  = require('discord.js');
const  prefix  = require("../config.json");




module.exports = 
    name: "report",
    description: "This command allows you to report a user for smurfing.",
    catefory: "misc",
    usage: "To report a player, do $report <discord name> <reason>",
    async execute(message, client)

        function getUserFromMention(mention) 
            if (!mention) return;
        
            if (mention.startsWith('<@') && mention.endsWith('>')) 
                mention = mention.slice(2, -1);
        
                if (mention.startsWith('!')) 
                    mention = mention.slice(1);
                
        
                return client.users.cache.get(mention);
            
        
        

        const args = message.content.slice(prefix.length).trim().split(/ +/);
        const command = args.shift().toLowerCase();

        const offender = getUserFromMention(args[0]);

        if (args.length < 2) 
            return message.reply('Please mention the user you want to report and specify a reason.');
        
    
        const reason = args.slice(1).join(' ');

        message.reply("You reported",offender,"for reason:", reason)
    


如果我不提,我最终会得到this

如果我确实提到 this 我收到上述错误但没有响应。

(node:4044) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'cache' of undefined

Index.js:

const fs = require('fs');
const Discord = require("discord.js");
const  prefix, token  = require('./config.json');
const client = new Discord.Client();
client.prefix = prefix;
client.commands = new Discord.Collection();


const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));

for (const file of commandFiles) 
    const command = require(`./commands/$file`);
    client.commands.set(command.name, command);

const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js'));

for (const file of eventFiles) 
    const event = require(`./events/$file`);
    if (event.once) 
        client.once(event.name, (...args) => event.execute(...args,client));
     else 
        client.on(event.name, (...args) => event.execute(...args,client));
    


client.login(token);

【问题讨论】:

你能显示你调用它的代码吗? @MrMythical 编辑了它。 调用,我的意思是你把&lt;something&gt;.execute()放在哪里 另外,要将字符串放在一起,您必须使用+,而不是,。在 message.reply 中使用它:"You reported " + offender + " for reason: " + reason 好的,字符串部分有问题,谢谢你现在改一下@MrMythical 【参考方案1】:

您不必创建函数来从消息中获取提及,您可以使用Message.mentions property 来获取提及,查看文档以获取有关它的其他信息。 这应该可以解决您的问题。

const  prefix  = require("../config.json");

module.exports = 
    name: "report",
    description: "This command allows you to report a user for smurfing.",
    catefory: "misc",
    usage: "To report a player, do $report <discord name> <reason>",
    async execute(message, client) 

        const args = message.content.slice(1).trim().split(/ +/);
        const offender = message.mentions.users.first();
        // users is a collection, so we use the first method to get the first element
        // Docs: https://discord.js.org/#/docs/collection/master/class/Collection 

        if (args.length < 2 || !offender.username) 
            return message.reply('Please mention the user you want to report and specify a reason.');
        
    
        const reason = args.slice(1).join(' ');

        message.reply(`You reported $offender for reason: $reason`);
    

【讨论】:

另外,client.users 说 undefined 的原因是您在文件顶部声明了 Discord.client,即使您没有使用它。构造函数以大写字母开头且 Discord.client 未定义 这里有问题,这就是为什么要使用一个函数。 msg.mentions.users.first()` 不一定会在消息中首次提及。它可以以不同的方式订购,您需要使用提及。 (如果你在原因中提到某人,这只会是一个问题) 是的,我担心有人会在第二条消息@MrMythical 中提到另一个用户,但老实说这很有效,所以我会继续使用它 好吧,只要去掉需要的 discord.js 部分,该功能就可以工作了 @MrMythical discord.js 按从 API 接收的顺序订购它们,不是随机的,我已经多次使用这种方法没有任何问题。所以我认为不会有一个【参考方案2】:

如果您已经在根文件中启动了客户端的新实例,为什么还要在命令文件中调用客户端?尝试从代码顶部删除客户端。希望有效

【讨论】:

问题很可能不仅如此。它也可能在.execute()中,它的顺序错误 是的,也是。 是的,问题是,require('discord.js').client 是未定义的。构造函数以大写字母开头。所以你甚至不需要在这个文件中使用 discord.js! 我试过了,但仍然得到:(node:25952) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'cache' of undefined 你拿出了 ... = require('discord.js')?

以上是关于(节点:4044)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“缓存”的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow.js使用节点保存模型

[BZOJ4044]Virus synthesis 回文自动机的DP

HDU4044 GeoDefense

Bzoj4044 Virus synthesis

bzoj4044 [Cerc2014] Virus synthesis

bzoj 4044: [Cerc2014] Virus synthesis回文自动机+dp