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

Posted

技术标签:

【中文标题】(节点:10388)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“缓存”【英文标题】:(node:10388) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'cache' of undefined 【发布时间】:2021-09-01 15:02:03 【问题描述】:

我遇到了上述错误,我只是在测试是否可以在特定公会的频道中发送违规者的标签,并且代码看起来很像下面(忽略一些不一致的部分。下面是cmd文件中的代码。

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();

        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(2).join(' ');

        client.channels.cache.get('xxxxx').send(offender);

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

这个命令在没有下面一行的情况下完全可以正常工作。

client.channels.cache.get('xxxxx').send(offender);

但是一旦包含此行运行,我就会收到此错误。

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

下面是我的索引文件。

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);

事件:

message.js

module.exports = 
    name: "message",
    execute(message,client)
        if (!message.content.startsWith(client.prefix) || message.author.bot) return;
        const args = message.content.slice(client.prefix.length).trim().split(/ +/);
        const command = args.shift().toLowerCase();
        if (!client.commands.has(command)) return;
        try 
            client.commands.get(command).execute(message ,args, client);
         catch (error) 
            console.error(error);
            message.reply('there was an error trying to execute that command!');
        
    

ready.js

module.exports = 
    name: "ready",
    once: true,
    execute(client)
        console.log("successfully logged in!");
        client.user.setActivity("VTB", 
            type: "STREAMING",
            url: "https://www.twitch.tv/monstercat"
      );
    

【问题讨论】:

你能用你的消息事件编辑帖子吗?似乎您没有从消息事件中传递客户端,并且像下面的答案一样,我认为这不是事件处理程序本身的问题,而是事件消息 您似乎将事件存储在事件文件夹中,因此使用消息事件文件代码编辑帖子您应该有类似command.execute(message,.....something here) @TYPICALNINJA 好的会显示 哦,你找到了答案,我询问了消息事件,因为我需要查看你传递给命令的参数(你传递了message ,args, client,但只在你的命令,导致client = args,因为args是第二个参数) 【参考方案1】:

您的问题可能来自这一行:

(...args) => event.execute(...args, client)

这基本上意味着“获取所有参数并将它们传递给event.execute”,因此您传递的参数数量不确定(取决于事件类型)并且client 不能保证是第二个,因为你期待。

为了提供更多细节,Discord 客户端可以发送多种不同类型的事件,并且每种类型的事件在回调中提供不同数量的参数。换句话说,通过这样写:(...args) =&gt; event.execute(...args,client) 您正在检索未知数量的参数,并将它们全部传递给 event.execute 函数,因此 client 参数的位置可能会有所不同,它不一定是第二个,因为您期望在函数签名中:async execute(message, client)

如果不需要其他参数,您可以只检索第一个参数,如下所示:

client.once(event.name, arg => event.execute(arg, client));

如果您绝对需要所有参数,请先传递客户端,这样它就永远不会移动,如下所示:

client.once(event.name, (...args) => event.execute(client, ...args));

同时修改execute签名:

async execute(client, ...args) 

【讨论】:

你能详细说明一下吗? 不知道为什么这被否决了,也许尝试提到OP应该将execute(...args, client)中的顺序更改为execute(client, ...args)。但是他们也需要在每个命令文件中更改它... @ZsoltMeszaros 还有其他方法吗?这将非常耗时... 他只显示了他的事件加载器?而不是他的实际消息事件,在事件文件中客户端将是最后一个参数,但在命令文件中它将推迟到他们如何将参数传递给执行函数 我在整个文件中都试过了,没有用,最后出现 TypeError: commands is not iterable【参考方案2】:
module.exports = 
    name: "eg",
    description: "not ready",
    category: "test",
    execute(message, args, client)
        const channel = client.channels.cache.get('853031094054944798');
            channel.send('test');
    

这是在客户端修复它之前添加的参数。

所以在这个例子中:

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, args, client) 

        const args = message.content.slice(1).trim().split(/ +/);
        const offender = message.mentions.users.first();

        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(2).join(' ');

        client.channels.cache.get('xxxxx').send(offender);

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

应该是这个。

【讨论】:

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

[Oracle]ORA-600[kdBlkCheckError]LOB坏块处理

js基础篇——变量

打开意图相机时,提供者无权访问内容

js基础的总结

NodeJS基础

JS基础语法