我正在为我的机器人执行addrole命令,但是每当有人弄错角色时,它都会出错。我不知道如何解决它,所以请帮忙
代码:
if (!message.content.startswith(prefix) || message.author.client) return;
const arguments = message.content.slice(prefix.length).split(‘‘);
const command = arguments.shift().toLowerCase();
if (command === ‘addrole’) {
const suggestedRole = arguments[1] // role from the message
const role = message.guild.roles.cache.find(role => role.name === suggestedRole) // trying to find the role
if(!role) message.channel.send(‘Role does not exist!’) // if the role doesn’t exist
const target = message.mentions.members.first() // target
if(!target) message.channel.send(‘User not found!’) // if no target
target.roles.add(role) // adds the role to the target
}
现在您可能会想:“如果角色有两个单词,该怎么办”,我正在研究中,我只需要帮助,以便如果该角色不存在,它不会发出错误,而只会发送“找不到角色”。请帮助我,谢谢。抱歉,由于缺少详细信息,不知道还要添加什么。
答案 0 :(得分:1)
message.guild.roles.cache.find
将返回一个承诺,因此在访问角色之前,您需要处理该承诺。一种方法是使用.then和.catch。
message.guild.roles.cache.find(role => role.name === suggestedRole)
.then((role)=>{
//what to do if the role does exist using the role parameter
}).catch(()=>{
//what to do if the role does not exist, in your case,
message.channel.send(‘Role does not exist!’)
})
之所以需要这样做,是因为正如我所说,cache.find()将返回一个Promise。一个诺言既可以实现,也可以被拒绝。如果您要搜索的角色不存在,您将收到未处理的承诺拒绝,这在某些情况下可能会导致程序崩溃。为了阻止这种情况,我们需要考虑您的承诺可能处于的不同状态。我们使用.then和.catch进行此操作。如果您的诺言得以兑现,则将调用.then块。如果拒绝,则调用.catch块。使用.catch块,您的代码现在知道遇到错误时该怎么办,在这种情况下,我们要告诉它发送一条消息,指出“未找到角色”。我希望这段代码能对您有所帮助,并希望您的解释能帮助您理解Promise背后的一些重要概念。
答案 1 :(得分:1)
您实际上可以使用try catch,对于不熟悉promise的人来说,这似乎简单得多。看起来像
try{
//will attempt to run the code in this try block
const target = message.mentions.members.first() // target
if(!target) message.channel.send(‘User not found!’) // if no target
target.roles.add(role) // adds the role to the target
} catch {
//will run if an error occurs in the try block
message.channel.send(‘Role does not exist!’)
}
这与我的其他解决方案的工作原理几乎相同,但是有些不同。我不会像上次那样深入解释它,所以,这里有一个关于try catch块及其作用的简单解释:https://www.w3schools.com/js/js_errors.asp。
答案 2 :(得分:0)
此代码将检查角色是否存在,如果不发送错误消息,如果存在,则将角色添加到成员,如果发生错误,将发送“无法添加角色”。
const role = message.guild.roles.cache.find(role => role.name === 'roleName');
if(!role) return message.channel.send('Role not found.')
const member = message.member;
member.roles.add(role).catch(() => { message.channel.send('Can\'t add role.') });