我是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);
那么有没有办法在运行时以非阻塞/异步方式要求文件?
我不认为总是可以在“启动时”而不是运行时加载文件,因为像上面的示例一样,了解要加载/需要的文件的唯一方法是通过{获取名称{1}}财产。
所以这似乎是唯一的选择。除非,文件夹中的所有文件都是预先加载的,然后按名称调用,在回调中(通过使用req.url
或其他东西迭代文件夹中的所有文件,并将获得的文件名称与{{ 1}}属性),但这看起来很浪费。 “预加载”文件夹中的所有文件(可能大约50个文件),然后只使用其中的1个,这似乎不是一个好主意。我错了吗?
无论哪种方式,我只想知道是否有办法以更好,非阻塞/异步的方式在运行时中要求文件。
谢谢!
答案 0 :(得分:5)
函数require()
通常用于在大多数应用程序运行之前缓存模块或配置文件。您可以考虑使用require()
,如下所示:
var file = fs.readFileSync('/path');
// depending on the file type
eval(file);
JSON.parse(file);
以这种方式完成的原因是依赖性按顺序加载。如果要在初始化应用程序后读取文件,则应使用异步读取,并在回调中进行响应,如下所示:
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);