清空数组后,代码没有读取到它是空的
Posted
技术标签:
【中文标题】清空数组后,代码没有读取到它是空的【英文标题】:After Emptying an Array, the Code Isn't Reading That It's Empty 【发布时间】:2021-04-09 15:40:57 【问题描述】:我正在尝试将临时信息发送到一个 json 文件,我可以在其中将它们存储为对象数组,然后在一段时间后自动将文件重置为空数组。
代码起初读得很好并存储了信息,但是一旦它设置回一个空数组,代码就不再读取它是空的,并且仍然在不应该做的事情。当使用下面的 join 命令时,它应该检查它是否为空,如果是则返回并且不存储任何东西,直到那里首先有敌人。 “用户加入战斗”的响应仍然发生,并且数组中没有存储任何内容。
这是连接命令
const Discord = require('discord.js');
const fs = require('fs');
const enemySpawn = require('../EnemySpawn.json');
const rpgbot = require('../colors.json');
module.exports =
name: 'join',
description: 'Used to join the grouping of players to fight an enemy that spawns',
execute(message, args)
if (enemySpawn.length == 0) return message.channel.send('There\'s no enemy to fight!');
if (enemySpawn.some(user => user.id === message.author.id)) return message.channel.send('You already joined the current fight!');
// TODO add users stats
enemySpawn.push(
name: message.author.username,
id: message.author.id
)
fs.writeFile('./EnemySpawn.json', JSON.stringify(enemySpawn), err =>
if (err) console.error(err);
);
// TODO add current level of the user
const embed = new Discord.MessageEmbed()
.setColor(rpgbot)
.addField(`$message.author.username joined the fight!`, '\u200B')
message.channel.send(embed);
,
;
这里是先获取敌人并储存的功能
const fs = require('fs');
const enemySpawn = require('./EnemySpawn.json');
const enemies = require('./Enemies.json')
getEnemy: function (message)
if (!(enemySpawn.length == 0)) return;
let randomEnemy = enemies[Math.floor(Math.random() * enemies.length)];
enemySpawn.push(
enemy: randomEnemy.name,
health: randomEnemy.health
)
fs.writeFile('./EnemySpawn.json', JSON.stringify(enemySpawn), err =>
if (err) console.error(err);
);
message.channel.send(`Watch out! A $randomEnemy.name appeared!`);
这里是当有人发送一条消息时调用它的地方,该消息还具有超时功能,可在 3 秒后清除数组以进行测试
const fs = require('fs');
const functions = require('./functions.js');
let used = false;
if (!used)
functions.getEnemy(message);
used = true;
setTimeout(function ()
used = false;
fs.writeFile('./EnemySpawn.json', JSON.stringify([]), err =>
if (err) console.error(err);
);
, 3000);
【问题讨论】:
考虑重新编写问题,只关注问题。抽象出不必要的代码,关注不为空的数组。 【参考方案1】:我看到你阅读 json 文件的唯一地方是:
const enemySpawn = require('../EnemySpawn.json');
这两个都在模块初始化中,只会在启动时执行一次。因此,在将空数组写回文件后,您永远不会再将其读回(除非您重新启动服务器)。
如果您希望再次读回该空数组,则必须在某些操作期间再次实时读取该 JSON 文件。
【讨论】:
所以你是说我必须把它放在每次调用函数时读取的实际函数中,而不是把它作为初始化? @QuazArxx - 如果您要做的是在执行函数之前获取文件的最新内容,那么是的,您需要在函数内读取文件的最新内容。我完全不清楚为什么不将此信息存储在模块级变量中并共享它。为什么你必须不断地读取和写入文件? 这似乎是一种存储对象的简单方法,因此我可以获取信息以供以后使用其他功能。特别是因为我的命令“join”存储在一个单独的文件夹中,并将其全部发送到一个文件似乎是要走的路。 @QuazArxx - node.js 的模块设计使您可以轻松地拥有一个“拥有”数组并导出它的模块。任何其他想要使用该数组的模块都可以导入它。只要您只是修改现有数组并且不为其分配一个新的、单独的数组,原始数组的所有持有者都会看到对它的所有修改(真正的数据共享)。如果需要,您可以读取/写入文件,但不必仅在几个模块之间共享数据。当您需要在服务器崩溃或重启时保持数据持久性时,您应该使用文件系统。 我以前使用过这种方法来存储不断读取和更新的信息,直到现在清空它之前我从来没有遇到过问题。我有一个使用完全相同的方式的级别系统和货币系统。我想我可以继续使用同样的方法,除了一个临时数组会改变它的内容。以上是关于清空数组后,代码没有读取到它是空的的主要内容,如果未能解决你的问题,请参考以下文章
Angular 2 + Ionic 2:对象推送到数组,但是当我尝试使用它时它是空的