(节点: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) => 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:无法读取未定义的属性“缓存”的主要内容,如果未能解决你的问题,请参考以下文章