Node.js – 在运行时加载文件

我对Node.js相当陌生,并且在运行时无法理解加载库或文件的方式。 显然,使用Node.js的本地“require”函数在运行时加载文件是一个坏主意,因为它阻塞了I / O,因此不应该在请求处理程序中使用。 所以,我假设要避免这样的事情:

var http = require('http').createServer(function(req, res) { var file = require('./pages/'+req.url); res.end(); }).listen(8080); 

那么是否有一种方法可以在运行时以非阻塞/asynchronous的方式要求文件?

我不认为总是可以在“启动时间”而不是运行时加载文件,因为就像上面的例子一样,知道要加载/需要的文件的唯一方法是通过req.url属性获取文件名。

所以这似乎是唯一的select。 除非,文件夹中的所有文件都是预加载的,然后通过名称调用callbackfs.readdirSync (通过使用fs.readdirSync或其他函数遍历文件夹中的所有文件,并将获取的文件名与req.url属性进行比较),但这似乎是浪费。 “预加载”文件夹中的所有文件(大约50个文件),然后只使用其中的1个,似乎不是一个好主意。 我错了吗?

无论哪种方式,我只想知道是否有一种方法,以更好,非阻塞/asynchronous的方式在运行时需要文件。

谢谢!

函数require()通常用于在大多数应用程序运行之前caching模块或configuration文件。 你可以想到使用require()有点像这样:

 var file = fs.readFileSync('/path'); // depending on the file type eval(file); JSON.parse(file); 

这样做的原因是为了依赖加载顺序。 如果要在初始化应用程序之后读取文件,则应使用asynchronous读取,并在callback中进行响应,如下所示:

 var http = require('http'); http.createServer(function(req, res) { fs.readFile('./pages/' + req.url, function(err, data) { res.end(data); }); }).listen(8080); 

如果您需要检查文件是否存在,那么可以使用fs.stat()来检查文件的存在,而不是查询目录。

 var http = require('http'); http.createServer(function(req, res) { var file = './pages/' + req.url; fs.stat(file, (err, stats) { if (err || !stats.isFile()) { res.writeHead(404); res.send(); return; } fs.readFile(file, function(err, data) { res.writeHead(200); res.end(data); }); }); }).listen(8080);