它是一个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
)以查看浏览器中的更改。
是否有任何方法或任何模块只能通过刷新浏览器来查看效果(保持服务器正常运行)。
答案 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)
在探索之后,我找到了一个Node 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"
发生任何变化后,我会在需要时刷新浏览器,它会给我更新的结果。