您好我是节点新手,我正在尝试了解如何处理节点进程。我已经读过应该不惜一切代价避免使用同步方法,这需要编译/缓存文件,后续调用每次使用缓存而不是从磁盘读取。
在boot file的MVC示例中ExpressJS repo的第7行,调用readdirSync,循环所有控制器并实例化它们以动态创建路由。
当向服务器发出请求时,会发生什么?
a)启动应用程序编译/缓存它,路由和回调存储在内存中以满足将来的所有请求。
b)引导运行每个请求,每次调用服务器时都会从磁盘读取控制器并实例化。
c)还有别的吗?
如果是a,我可以看到为什么作者会使用同步调用。代码更清晰,在初始阶段阻塞并不像在请求期间阻塞那么糟糕。如果它的b,在每次请求开始时都不会阻塞性能大大影响吗?
谢谢!
答案 0 :(得分:2)
文件在初始化期间运行,并且只运行一次。你可以在这里看到:
require('./lib/boot')(app, { verbose: !module.parent });
在Node中,您通常不想阻止主事件循环,这是同步函数倾向于执行的操作。例如,假设您有一个加载文件的HTTP处理程序:
app.get('/', function(req, res) {
res.send(fs.readFileSync('./file.log'));
});
这是同步完成的,并将阻止事件循环,直到文件完全加载,从而阻止处理任何其他HTTP请求。因此,我们通常在初始化期间将内容缓存到内存中以防止阻塞。
如果在初始化期间缓存,则文件仅加载一次。
var file = fs.readFileSync('./file.log');
app.get('/', function(req, res) {
res.send(file);
});
但另一种方法是使用异步读取:
app.get('/', function(req, res) {
fs.readFile('./file.log', function(err, data) {
res.send(data);
});
});
您通常不希望这样做,因为如果您有大量请求会怎样?你会浪费I / O一遍又一遍地从磁盘读取同一个文件。
答案 1 :(得分:1)
这是a)发生的事情。你的假设都是正确的。同步调用更干净,只在初始化期间发生一次。 Express小心不要在请求处理程序中执行任何阻止。