如果我在另一个js文件中使用writeFile(),是否需要再次调用readFileSync()?

时间:2018-05-17 04:25:35

标签: javascript node.js fs discord discord.js

我制作了一个不和谐的机器人,我现在的设置是这样的:

有index.js处理命令。

如果命令是X,则转到X.js

如果命令为Y,则转到Y.js

我让X.js和Y.js使用fs.readFileSync()和fs.writeFile()

读取和写入相同的JSON文件(在非冲突区域中)

fs.readFileSync()仅在命令脚本启动时在每个X和Y中调用一次。 通过一次调用,同一个文件中的读/写工作正常,但我还没有测试它是如何工作的,多个脚本在开始时通过一次调用写入同一个文件。

我认为这不起作用?

而且,假设它不起作用,你们会建议什么解决方案?

每次调用命令X / Y时都在X / Y中调用fs.readFileSync()(效率如何?现在我不经常调用命令 - 最多可能每小时几次 - 但如果这最终公开,那么每秒可能会有很多X / Y的调用。这会对文件系统/机器人/等产生很大的压力吗?我认为不会,只是确定!)

创建一个外部脚本来处理读取和写入(X / Y会在此脚本上调用数据,并输出要写入的数据。)

为每个脚本使用不同的文件(啊,我真的不想这样做!!)

也许是另一种解决方案?谁知道......

如果有人做了类似的事情/知道解决方案,请不要犹豫发布:) 谢谢!

1 个答案:

答案 0 :(得分:0)

您想要做的事情被称为" Hot Reloading"。虽然热负荷很棘手。

如果在更改之后需要指向同一文件的路径,则将返回旧模块,因为它已经在内存中,这可以防止过多的磁盘I / O.如果您确实要加载较新的模块,您还需要清除旧模块

相反,我建议您使用像nodemon这样的软件包,它将在文件更改时重新启动整个应用程序:

# You may need to use sudo on linux/macOS or Administrative 
npm i -g nodemon 

# Restart your Terminal
nodemon ./path/to/your/file.js

根据您的描述,我假设您正在从用户输入并使用它来动态创建文件的路径。这可能是一个坏主意,因为我可以使用像!../../index.js这样的命令,并可能搞乱你的机器人。

要处理我自己使用更复杂的系统来处理命令,但这可能是一个好的开始。

const commands = {};

const modules = load_modules_from_directory();

for ( const module of modules ) {
    commands[ module.name ] = module.function;
}

function messageHandler( message ) {
    if( !is_valid_command( message.content ) )
        return

    const command_string = 
        remove_prefix_and_get_first_word( message.content );

    if ( commands.hasOwnProperty( command_string ) ) 
        commands[ command_string ]( message );
}