'fs'模块没有立即生效,需要重启服务器

时间:2016-09-09 04:07:14

标签: javascript node.js npm webpack fs

它是一个NodeJS项目。我正在使用npm start来启动服务器。

在这个项目中,我正在使用"./mydir/"读取文件夹'fs.readdirSync'的文件,推送数组中的文件并在控制台上打印。

  var fs = require('fs');     
  var results= []; 
  var files = fs.readdirSync('./mydir/');
  for (var i in files) {
    results.push(files[i]); 
  }
  console.log(results); 

代码工作正常,并在控制台上打印该目录的文件。

但是,当服务器打开时,当我从该目录'./mydir/'插入/删除文件(手动)并刷新浏览器时,它没有向我显示效果(推送/打印前面的结果) 。我需要重新启动服务器(^C然后npm start)以查看浏览器中的更改。

是否有任何方法或任何模块只能通过刷新浏览器来查看效果(保持服务器正常运行)。

3 个答案:

答案 0 :(得分:0)

node.js服务器是长时间运行的进程和变量,它们在服务器进程本身的持续时间内最后限定在给定请求之外,不会为每个请求自动再次创建它们(就像其他一些环境可能那样)。

因此,当您想要更新结果时,只需再次运行代码即可。您可以将它放在一个函数中,并在需要更新结果时调用它:

  var fs = require('fs');     

  function getFiles() {
      var results = []; 
      var files = fs.readdirSync('./mydir/');
      for (var i in files) {
        results.push(files[i]); 
      }
      console.log(results);
      return results;
  }

然后,您可以在需要更新或刷新结果时随时调用服务器上的该功能。

还可以监视文件系统中的更改,通过查看发生的更改并在此时更新缓存,您可以使用fs.watch()自动更新文件列表。

答案 1 :(得分:0)

您读取数据一次,打印它然后似乎什么也没有,至少如果您的服务器中没有其他代码重复该代码段。但由于效率的原因,一遍又一遍地重复阅读目录并不是一个好主意。

您需要跟踪目录以进行更改,并在发生更改时重新读取。有一个简单的模块,它使用操作系统的机制来执行此操作:inotify

您的代码可能如下所示:

var fs = require('fs'),
    Inotify = require('inotify').Inotify,
    inotify = new Inotify(),
    path = './mydir';

inotify.addWatch({
    path:      path,
    watch_for: Inotify.IN_CREATE | Inotify.IN_DELETE,
    callback:  function () {
        var results= []; 
        var files = fs.readdirSync(path);
        for (var i in files) {
             results.push(files[i]); 
        }
        console.log(results);
    }
});

答案 2 :(得分:0)

在探索之后,我找到了一个N​​ode js模块"forever",它使我的服务器保持运行并跟踪目录"./mydir/"中的任何更改。

我在dependencies的{​​{1}}中添加了它:

"package.json"

"dependencies": { "forever": "^0.15.2" } 的{​​{1}}中添加npm start的别名,如下所示:

scripts

可选地,对"package.json"中的行 "scripts": { "start": "forever --watch --watchDirectory ./mydir ./server.js" } 发表评论,以防止在open(url)每次更改后打开浏览器。

它有效!现在"server.js"发生任何变化后,我会在需要时刷新浏览器,它会给我更新的结果。