类型错误:无法读取未定义的不和谐 js 的属性'first'



我知道我在这方面不是最好的,我还在学习,但有人能帮我纠正错误吗;CCD_ 1";这与"="符号有关,我只是不确定该把它改成什么。

if (!message.member.hasPermission('MANAGE_CHANNELS')) return message.reply(Embed3)
if (!args[0]) return message.reply(Embed2)
if (!message.mentions.channels.first()) return message.reply(Embed1)
let role = message.guild.roles.cache.find(r => r.name = args[1]); //const role = message.mentions.roles.first
if (!role) return message.reply(Embed4);

当前错误为

TypeError: Cannot read property 'first' of undefined

我一直在遵循这个指南,但仍然不知道该怎么办。

非常感谢您的帮助,谢谢您,祝您度过美好的一天!:(

EDIT 1

在我的index.js中,我有这个

--


client.on('message', message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
let args = message.content.substring(prefix.length).split(" ");
const command = args.shift().toLowerCase();
if (command === 'lock') {
client.commands.get('lock').execute(message, args)
} else if (command === 'unlock') {
client.commands.get('unlock').execute(message, args)
}
})

EDIT 2

此行后停止打印

if (channel.name.startsWith('🔒')) return message.reply(Embed5); console.log('All this works')
// STOPS PRINTING //
await message.mentions.channel.first.setName(`🔒${channel.name}`);  // If channel name is not changed it's being rate limited. 
try {
await channel.updateOverwrite(role, {
SEND_MESSAGES: false
}); 
message.channel.send(Embed6);
} catch (err) {
console.log(err);
message.channel.send(Embed7); 
}
});
}
}

因此,根据我在discord文档中阅读的内容

https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=mentionshttps://discord.js.org/#/docs/main/stable/class/MessageMentions?scrollTo=channels

以及我在你的代码中看到的:

如果在不同频道中没有提及,则提及可能没有channels属性集。因此,您可能需要检查:

if (message.mentions.channels || !message.mentions.channels.first()) return message.reply(Embed1)

你使用的发现也很奇怪:

let role = message.guild.roles.cache.find(r => r.name = args[1]);

filter方法中的此语句将始终将缓存的名称设置为args[1]并返回值。如果args[1]是真的,那么它将返回第一个缓存对象。你需要的是在这个地方进行比较

let role = message.guild.roles.cache.find(r => r.name == args[1]); // does not check type
or
let role = message.guild.roles.cache.find(r => r.name === args[1]); // checks type

编辑2:

您可能还需要检查访问channel.first()道具的方式。CCD_ 7是一种方法。如果你想让这个方法的结果是shure调用它。

并用then方法正确地处理了promise。既然setName会抛出一个Promise,你就需要接受它!https://discord.js.org/#/docs/main/stable/class/GuildChannel?scrollTo=setName

message.mentions.channels.first().setName(`🔒${channel.name}`).then((result) => { // If channel name is not changed it's being rate limited.
try {
await channel.updateOverwrite(role, {
SEND_MESSAGES: false
}); 
message.channel.send(Embed6);
} catch (err) {
console.log(err);
message.channel.send(Embed7); 
}
});

还要小心核心内联代码并检查控件结构。如果您正在使用VScode,请使用格式化方法:如何在Visual Studio代码(VScode(中格式化代码

请尝试阅读现代JS中的async/await语句。https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/async_function

如果您想在这里使用await语句,请将其封装在异步函数中,或者使用then方法在处理后继续执行。

我认为您的错误可能是试图在频道中找到第一个提到的用户。为此,您需要使用let role =0。如果您使用async,请确保遵守您的承诺!

如果这不是你想要的,并且你只是想找到消息中提到的第一个运行命令的用户,那么你需要使用:

if (!message.mentions.users.first()) return message.reply(Embed1)

最新更新