【问题标题】:Array doesn't log anything数组不记录任何内容
【发布时间】:2021-02-04 05:11:33
【问题描述】:

我在记录数组时遇到问题。在我的 discord bot 中,我检索了我的 bot 所在的所有服务器 ID。我的 bot 对每个服务器都有不同的语言(默认为英语),所以我需要跟踪它,以便我可以使用该语言发送消息那得救了。我不想请求数据库,而是想构建一个小缓存(在 bot 上启用检索每个服务器的语言)。但问题是,即使我插入,将对象推送到数组,数组仍然是空的(我 console.loged 它)。所以问题是......如何?

    serverIdd.forEach(async (server) => {
    
        let serv = await find("serverList", parseFloat(server));

        if (!serv[0]) {

            await insertServer(server, defLang); // returns promise 
            
            serverLangCache.push({ id: server, lang: defLang })
            

        } else {
            console.log(server + " is already in!");
            let lang = serv[0].lang;
            
            serverLangCache.push({ id: server, lang: lang})

        }
        
        
        
    });
    console.log(serverLangCache); <-- this executes before the foreach does
    //Logs:

   //[] <-- the console log logs an empty array
   //436072156871262200 saved to serverList <-- now the foreach is going off 
   //490471288255676400 saved to serverList <-- now the foreach is going off 

【问题讨论】:

  • 我不认为.join() 做你认为它做的事。你的意思是.push() 吗?
  • 好吧,奇怪的事情发生了。我使用推送,当服务器在数据库中时,它会记录pastebin.com/LWdXdhBS,但如果服务器不在阵列中,它甚至不会记录阵列

标签: node.js mongodb discord.js


【解决方案1】:

哇!终于,我们明白了! (如果有人遇到同样的问题,请发布)

所以最终的代码是这样的:






client.once('ready', async() => {
    

    let index = 0;
    console.log("ready!");
    

    let serverIdd = await client.guilds.cache.map(guild => guild.id);
    let defLang = "en";
        
        let serverLangCache = [];
        debugger;
        
            
        for (let i = 0; i < serverIdd.length; i++) {
            
            
            let serv = await find("serverList", parseFloat(serverIdd[i]));
    
            if (!serv[0]) {
    
                insertServer(serverIdd[i], defLang)
                
                serverLangCache.push({ id: serverIdd[i], lang: defLang })

                
                
                
    
            } else {
                console.log(serverIdd[i] + " is already in!");
                let lang = serv[0].lang;
                
                serverLangCache.push({ id: serverIdd[i], lang: lang})
    
            }
        
            
            
        
        
        
            
        }
            
        console.log(serverLangCache);
        

    
    

    let act = ["b!help", `Server count: {count}!`, "braumobot.site", "Work in progress, bot disabled"];
    setInterval( () => {
        config = readConfigFile();
        if (index != 4) {

            client.user.setActivity(act[index].replace("{count}", config.servers.length), {
                type: "PLAYING",
            })
            index++;
        } else {
            index = 0;
        }




    }, 5000);



    





});
});

所以你看,问题甚至不在于最初在帖子中的代码。问题是

function insertServer(serverId, langu){

    
        
    
        
    let srv = new Server({
        id: serverId,
        lang: langu
    });
        
    
    srv.save().then((s)=>{
        console.log(s.id + "saved to serverList");

    })
    


    


}

功能。我使它异步并认为它可能会有所帮助,但后来意识到它不需要异步。我删除了 await 并删除了函数中的 promise,它就像一个魅力! (谢谢 VS 代码调试器

【讨论】:

    【解决方案2】:

    为了使事情按预期运行,您应该避免一些问题:

    1. 不应使用数组进行缓存,而应使用 Map:
    const serverLangCache = new Map();
    ...
    serverLangCache.set(server, { id: server, lang });
    console.log(Array.from(serverLangCache.values()));
    
    1. 不要使用.forEach 来运行异步任务,它不会像您预期的那样工作,请改用普通循环或for...of

    【讨论】:

    • 好的,但还有另一个问题。我使用了 for of 循环,但它循环遍历数组中的每个 id,当它需要将其保存到数据库时它会卡住(它会保存它但其余部分不会关闭)pastebin.com/EgSHvu9b 看看结尾粘贴箱
    • 我为什么要使用地图而不是数组?
    • 可能会抛出异常,不推荐使用异步函数回调,因为它会导致未处理的promise拒绝,您应该处理错误以进一步调试:client.once('ready', (async() =&gt; {...})().catch(e =&gt; {console.log(e.message)});
    • 既然你称它为缓存,你必须处理重复/存在的项目,maparray 更好地为你解决它。
    • 现在它搞砸了pastebin.com/tfUePnYB 日志在粘贴箱的底部
    猜你喜欢
    • 2012-07-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2017-11-16
    相关资源
    最近更新 更多