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);