Javascript 角色分配机器人有时不会删除角色

Javascript 角色分配机器人有时不会删除角色,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,我想创建一个bot,根据用户使用的双语服务器语言为用户分配角色,但如果我尝试给自己捷克语角色,它会给我角色,但不会删除其余角色: const Discord = require('discord.js'); const client = new Discord.Client(); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('message', m

我想创建一个bot,根据用户使用的双语服务器语言为用户分配角色,但如果我尝试给自己捷克语角色,它会给我角色,但不会删除其余角色:

const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
  if (msg.channel.name == 'bot') {
    var sender = msg.guild.members.resolve(msg.author.id);

    if (msg.content == 'english' || msg.content == 'bilingual' || msg.content == 'czech') {
      sender.roles.remove(['719865762453389344', '719865894733479936', '719866013524688926']);
      switch (msg.content) {
        case 'czech':
          sender.roles.add(['719865762453389344']);
          console.log("czech");
          break;
        case 'bilingual':
          sender.roles.add(['719865894733479936']);
          console.log("bilingual");
          break;
        case 'english':
          sender.roles.add(['719866013524688926']);
          console.log("english");
          break;
        default:
      }
    }
    msg.delete();
  }
});

client.login('CENSORED');
犯了一个可怕的错误

(node:16796) UnhandledPromiseRejectionWarning: AbortError: The user aborted a request.
    at RequestHandler.execute (C:\Users\CENSORED\node_modules\discord.js\src\rest\RequestHandler.js:107:21)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:16796) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 6)

我知道到处都有未处理的事情,你当然可以责怪我,甚至指出它们,但我计划稍后处理它们,因为现在我想完成基本结构。

将你的代码放在try-catch块中:

try {
  // code
} catch (e) {
  console.log(e);
};
用户有可能在请求中间关闭了Discord窗口,在这种情况下,除了适当地处理错误之外,实际上没有什么可以做的


我建议做的另一件事是使用msg.member,而不是声明sender变量。当只向成员添加一个角色时,不需要传入数组,只需传入一个字符串。

我后来发现,出于某种原因,延迟添加角色可以解决问题,如下所示:

sender.roles.remove(['719865762453389344', '719865894733479936', '719866013524688926']);
setTimeout(function(){
  sender.roles.add(['719865762453389344']);
}, 500);

这不是最理想或可扩展的解决方案,但目前看来效果不错。

这是一件很有帮助的事情,但并不能解决我的核心问题,错误在于,我后来发现,大部分是我的错误,在现实世界中很少见。我真正想解决的问题是,我不能同时删除某人的角色并给他另一个角色。我无法使用.set,因为我只想删除某些角色。