首页 > 解决方案 > 清空数组后,代码读不到它是空的

问题描述

我正在尝试将临时信息发送到一个 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);
    }

标签: javascriptnode.jsarraysdiscord.jsfs

解决方案


我看到您阅读 json 文件的唯一地方是:

const enemySpawn = require('../EnemySpawn.json');

并且这两个都在模块初始化中,只会在启动时执行一次。因此,在将空数组写回文件后,您永远不会再次读回它(除非您重新启动服务器)。

如果您希望再次读回该空数组,则必须在某些操作期间再次实时读取该 JSON 文件。


推荐阅读