【问题标题】:'fs' module not showing immediate effect, need to restart the server'fs' 模块没有立即生效,需要重启服务器
【发布时间】:2017-01-17 03:22:19
【问题描述】:

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

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

  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)才能在浏览器中看到更改。

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

【问题讨论】:

  • 您的服务器读取文件一次,而不是每次页面加载。这是预期的行为。
  • 还有其他方式使用 Node js 模块吗?
  • 我确定有合适的解决方案,但我们不知道您要解决的实际问题是什么。
  • 如果该列表预计会发生变化,那么您可能不想缓存它,或者限制它的缓存时间。
  • 最简单的方法是为每个需要它的页面请求重新创建列表,而不是在服务器启动时创建一次。不过,您肯定希望避免使用 Syncronous 函数,以避免在请求获取列表时阻塞队列。

标签: javascript node.js npm webpack fs


【解决方案1】:

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() 自动更新文件列表,方法是查看发生的更改并在此时更新您的缓存。

【讨论】:

    【解决方案2】:

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

    您需要跟踪目录的更改并在发生更改时重新读取它。有一个简单的模块使用操作系统的机制来做到这一点: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);
        }
    });
    

    【讨论】:

      【解决方案3】:

      经过探索,我发现了一个 Node js 模块 "forever",它可以让我的服务器保持运行并跟踪目录 "./mydir/" 中的任何更改。

      我在"package.json"dependencies 中添加了它:

      "dependencies": {
          "forever": "^0.15.2"
        }
      

      并在scripts"package.json" 中添加了npm start 的别名,如下所示:

       "scripts": {
          "start": "forever --watch --watchDirectory ./mydir  ./server.js"
       }
      

      (可选)在"server.js" 中注释open(url) 行,以防止在每次更改"./dir" 后打开浏览器。

      它奏效了!现在,在 "./dir" 发生任何更改后,我会在需要时刷新浏览器,它会为我提供更新的结果。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        相关资源
        最近更新 更多