我知道我在这方面不是最好的,我还在学习,但有人能帮我纠正错误吗;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)