【问题标题】:Enmap (better-sqlite map) doesnt update until application is restartedEnmap (better-sqlite map) 在应用程序重新启动之前不会更新
【发布时间】:2020-03-19 22:22:09
【问题描述】:

这是我正在研究的不和谐机器人的代码片段

它需要从 Enmap 加载数据,将信息添加到该 Array,然后将其推回。

它成功地提取数据,进行所有的转换和添加等 并成功推送该数据

但是,在程序重新启动之前,它无法提取新数据。它被保存了,但是 let locationDataArray = await data.get(locationDataKey); 除非重新启动程序,否则似乎不会拉出这个新版本的地图

我很困惑

const Commando = require('discord.js-commando');
const levenshtein = require('fast-levenshtein');


const Enmap = require("enmap");
const data = new Enmap({
    name:"locationdata"
});

const settingsMap = new Enmap({
    name:"locationSettings"
})

module.exports = class addConnection extends Commando.Command{
    constructor(client){
        super(client, {
            name:"addconnection",
            group:"management",
            aliases:["connect"],
            memberName:"addconnection",
            userPermissions:['ADMINISTRATOR'],
            description:"adds a connection between two zones",
            examples: ['$addconnection <zone1>,<zone2>'],
            throttling: {
                usages: 1,
                duration: 5
            },
            args:[{
                key:'destinations',
                prompt:'what are the two areas you want to connect (seperate them with a comma , )',
                type:'string'
            }]
        });
    }

    async run(msg,args){

        //get our guilds Information
        let guildID = msg.guild.id;
        let locationDataKey = guildID+"_mapData";
        let locationDataArray = await data.get(locationDataKey);

        //Our Guild Settings
        let settingMapKey = guildID+"_setting";
        let settings = await settingsMap.get(settingMapKey);


        //chiefly out npcRoleID
        let npcRole = await msg.guild.roles.get(settings.npcRoleID);

        let connectionArray = await args.destinations.toLowerCase().split(",");

        for(var i = 0; i < connectionArray.length; i++){
            //make sure the item is valid
            var distance = levenshtein.get(connectionArray[i], locationDataArray[0].name);
            var closestDistance = distance;
            var closestWord = locationDataArray[0].name;

            for(var j = 0; j < locationDataArray.length; j++){
                distance = levenshtein.get(connectionArray[i], locationDataArray[j].name);
                if (distance < closestDistance){
                    closestDistance = distance;
                    closestWord = locationDataArray[j].name;
                }
            }

            //make sure all the areas are valid and good
            if(closestDistance < (closestWord.length/2)){
                connectionArray[i] = closestWord;
            }
            else{
                msg.channel.send("those channels don't seem to exist").then( msg => {
                    msg.delete(10000);
                });
                return;
            }  

        }
        //our array of connections now only contains valid options
        //loop over our location data array
        for(var i = 0; i< connectionArray.length; i++){
            for(var j = 0; j < locationDataArray.length; j++){
                //when we hit one of out LDA that has the same name as something in the connectionArray
                //stop add the rest of the connection array to its connections
                if(locationDataArray[j].name === connectionArray[i]){
                    for(var k = 0; k < connectionArray.length; k++){
                        if(locationDataArray[j].name == connectionArray[k]){

                        }
                        else{
                            if(!locationDataArray[j].connections.includes(connectionArray[k])){
                                await locationDataArray[j].connections.push(connectionArray[k]);
                            }

                            //get the role for the connection and the current channel
                            let role = await msg.guild.roles.find(role => role.name === connectionArray[k]);
                            let currentChannel = await msg.guild.channels.find(channel => channel.name === locationDataArray[j].channelName);


                            //the connection can read but not type in its connection
                            currentChannel.overwritePermissions(
                            role,
                            {
                                'SEND_MESSAGES':false,
                                'VIEW_CHANNEL':true,
                                'READ_MESSAGE_HISTORY':true
                            }
                            )


                            data.set(locationDataKey, locationDataArray);
                            msg.channel.send("Connected "+locationDataArray[j].name+" and "+connectionArray[k]);
                        }
                    }
                }

            }
        }   
    }
}

【问题讨论】:

    标签: javascript node.js async-await discord.js


    【解决方案1】:

    我知道这个问题很老了,我希望你很久以前就解决了这个问题,但为了后代,因为人们以后可能会发现这个问题,我还是会回答它。

    发生这种情况的原因是您在此文件中创建了一个新的 Enmap 实例,并且可能您也在其他文件中声明了它。这会导致为 Enmap 创建一个新的“客户端”,具有自己的缓存,并且 Enmap 无法更新这些实例。

    解决方案是将您的 Enmap 附加到您随身携带的变量(例如客户端),或者创建一个单独的节点模块,您可以将它导入到您需要的任何地方。 Enmap 文档中更详细地描述了这两个选项:https://enmap.evie.dev/usage/using-from-multiple-files

    免责声明:我是 Enmap 的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      相关资源
      最近更新 更多