【问题标题】:Discord.js: check if part of array is undefinedDiscord.js:检查数组的一部分是否未定义
【发布时间】:2020-07-16 21:10:20
【问题描述】:

我正在为我的服务器制作一个不和谐的机器人,我想包含一个 `%react` 命令。它的工作方式是“react #channel messageid emote”,它会让机器人对消息做出反应。目前我的代码运行良好,除了我想消除所有错误和警告,因为我真的很讨厌打开命令提示符或终端并看到一页又一页的文本。出于某种原因,`try{}` 语句会检测除最后一部分(表情)之外的所有内容,因此我尝试实现一个 `if()` 语句来检测消息的第 4 部分是否未定义。但是,这不起作用,我不知道为什么。
我的代码是这样的:
var splitMessage = message.content.split(' ')
if (splitMessage[0] === "%react") {
            if (message.member.roles.cache.has("staff-role-id") || message.author.id === "random-user-who-wanted-perms") {
                var channel = splitMessage[1].replace(/[<>:#]/gi, "");
                channel = client.channels.cache.get(channel);
                var messageid = splitMessage[2]
                var emote = splitMessage[3];
                emote = emote.replace(/[<>:abcdefghijklmnopqrstuvwxyz]/gi, "")
                 if (typeof splitMessage[2] !== "undefined" && splitMessage[2] && splitMessage[2] !== null) { 
                 
                  //executes no matter what

                    var emotetest = client.emojis.get(splitMessage[2])
                    try {
                        //console.log(channel)
                        const m = await channel.messages.fetch(messageid)
                        m.react(emote);
                        message.channel.send("Reaction added!")
                    } catch (e) { message.channel.send("Invalid Syntax, please check you have the right channel and ID"); }
                }
                else {
                    message.channel.send("Please provide an emote")
                }
            }
            else {
                message.channel.send("Insufficient Permissions")
            }
        }

我不知道为什么它不起作用(我觉得我已经尝试了所有方法)。任何帮助表示赞赏

【问题讨论】:

    标签: node.js discord.js


    【解决方案1】:

    当在try 块中使用异步代码时,您需要await 承诺才能被捕获。

    const rejectingFn = msg => new Promise((_, reject) => setTimeout(() => reject(msg), 500))
    window.addEventListener('unhandledrejection', ({reason}) => console.log('unhandled promise rejection:', reason))
    
    // Doesn't work
    try {
      rejectingFn('uncaught')
    } catch (error) {
      console.log('caught error:', error)
    }
    
    (async () => {
      // Works
      try {
        await rejectingFn('caught')
      } catch (error) {
        console.log('caught error:', error)
      }
    })()

    您的 try 块中有 2 个未处理的承诺:m.react(emote)message.channel.send("Reaction added!")。为确保捕获所有错误,请使用await

    此外,对message.channel.send 的其他调用也未处理,因此您可以将await 与它们一起使用,将所有内容包装在try 中并执行诸如记录错误以避免未处理的承诺拒绝(这将使Node. js 将来使用非零退出代码终止进程)。

    【讨论】:

    • 太棒了(我已经在使用异步函数了)!我应该在哪些部分添加等待?我不明白那部分......
    • @Komali await m.resct(emote); await message.channel.send("Reaction added!")
    • 嗯,这似乎什么也没做。还有其他想法吗?
    猜你喜欢
    • 2021-08-19
    • 2012-07-05
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多