Enmap(更好的sqlite映射)在应用程序重新启动之前不会更新



这是来自我正在处理的不和谐机器人的代码片段

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

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

但是,在程序重新启动之前,它无法提取新数据。它被保存了,但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]);
}
}
}
}
}   
}
}

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

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

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

免责声明:我是Enmap的作者

最新更新