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

Posted

技术标签:

【中文标题】如果我在另一个 js 文件中使用 writeFile(),是不是需要再次调用 readFileSync()?【英文标题】:Do I need to call readFileSync() again if I use writeFile() in another js file?如果我在另一个 js 文件中使用 writeFile(),是否需要再次调用 readFileSync()? 【发布时间】:2018-10-27 05:49:15 【问题描述】:

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

还有处理命令的 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 将调用此脚本获取数据,并输出要写入的数据。)

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

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

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

【问题讨论】:

如果你写入x.js中的文件,y.js中的内容不会为你神奇地更新 @JaromandaX 是的......这就是我的想法......我想我主要是在寻找最有效的解决方案 某些操作系统允许您监视文件中的更改。不确定节点是否可以访问此功能 啊,fs.watch 可以工作。我试试看,谢谢:) 是的,就是这个! 【参考方案1】:

您想要做的就是所谓的“热重载”。虽然热加载很棘手。

如果您在更改后需要相同文件的路径,则会返回旧模块,因为它已经在内存中,这可以防止过多的磁盘 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 );

【讨论】:

以上是关于如果我在另一个 js 文件中使用 writeFile(),是不是需要再次调用 readFileSync()?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 文件系统 - 在 fs.writeFile() 中使用变量

将文件写入节点js中的特定文件夹?

fs.writeFile 在新创建的 vue 项目中不起作用[重复]

如何在dojo工具包的Current JS文件中使用在另一个JS文件中创建的Dialog变量

fs.writeFile 没有错误,但是写入文件失败

使用 ReadFile 和 WriteFile 时出现死锁