我制作了一个不和谐的机器人,我现在的设置是这样的:
有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会在此脚本上调用数据,并输出要写入的数据。)
为每个脚本使用不同的文件(啊,我真的不想这样做!!)
也许是另一种解决方案?谁知道......
如果有人做了类似的事情/知道解决方案,请不要犹豫发布:) 谢谢!
答案 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 );
}