我们假设我有以下代码。我使用ExpressJS,但我不认为服务器部分与vanilla Node.js有很大不同。
var express=require('express');
var settings=JSON.parse(fs.readFileSync('settings.json','utf8')); // does this run only once (when the server starts)?
app.get('*',function(req,res){
res.write(fs.readFileSync('index.html')); // does this block other requests?
setTimeout(function(){
someSlowSyncTask(); // does this block other requests?
},1000);
res.end();
});
在上面的示例中,第一个readFileSync
在服务器启动时运行一次,还是每次服务器收到请求时运行?
对于第二个readFileSync
,是否会阻止Node处理其他请求?换句话说,在Node处理它们之前,所有其他请求是否必须等到readFileSync
完成?
修改:我添加了setTimeout
和someSlowSyncTask
。他们会阻止其他请求吗?
答案 0 :(得分:3)
您应该避免在服务器上使用同步方法。它们可用作单用户实用程序脚本的便利。
第一个只运行一次,因为它是同步方法。 * get路由在返回之前不会设置。
第二个将在任何http请求到达服务器时运行。是的,它会在同步调用期间阻塞整个服务器(打开和读取文件内容的I / O开销)。不要那样做。
答案 1 :(得分:1)
你是对的。首次启动服务器时,您的第一个readFileSync
将执行一次。
每次收到请求时都会出现第二个readFileSync
,但由于它存在于res.end()
的回调中(请记住 - Node.js本质上是非阻塞的),您可以收到任何号码只要您的内部函数也被写为非阻塞(例如,具有回调),请以非阻塞方式执行。但是,在您的情况下,超时不是异步写入的,因此会阻止服务器响应,直到它完成。