Javascript Node.js服务器如何处理请求?

Javascript Node.js服务器如何处理请求?,javascript,node.js,Javascript,Node.js,假设我有以下代码。我使用的是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.writ

假设我有以下代码。我使用的是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
,它是否阻止节点处理其他请求?换句话说,所有其他请求都必须等到
readFileSync
完成后,节点才能处理它们吗


编辑:我添加了
setTimeout
someSlowSyncTask
。它们会阻止其他请求吗?

您应该避免在服务器上使用同步方法。它们可以方便地用于单用户实用程序脚本

第一个方法只运行一次,因为它是一个同步方法。*get路由在返回后才会设置

第二个将在任何http请求到达服务器时运行。是的,它会在同步调用期间阻塞整个服务器(打开和读取文件内容的I/O成本)。不要那样做


互联网上有很多关于理解节点事件循环的文章。例如,和

您应该避免在服务器上使用同步方法。它们可以方便地用于单用户实用程序脚本

第一个方法只运行一次,因为它是一个同步方法。*get路由在返回后才会设置

第二个将在任何http请求到达服务器时运行。是的,它会在同步调用期间阻塞整个服务器(打开和读取文件内容的I/O成本)。不要那样做


互联网上有很多关于理解节点事件循环的文章。例如,你是对的。您的第一个
readFileSync
将在服务器首次启动时执行一次


第二个
readFileSync
将在每次收到请求时出现,但因为它存在于
res.end()
的回调中(记住-Node.js本质上是非阻塞的),所以只要内部函数也被编写为非阻塞的,就可以以非阻塞的方式接收任意数量的请求(例如,进行回调)。但是,在您的情况下,超时不是异步写入的,因此会阻止服务器响应,直到完成为止。

您是正确的。您的第一个
readFileSync
将在服务器首次启动时执行一次


第二个
readFileSync
将在每次收到请求时出现,但因为它存在于
res.end()
的回调中(记住-Node.js本质上是非阻塞的),所以只要内部函数也被编写为非阻塞的,就可以以非阻塞的方式接收任意数量的请求(例如,进行回调)。但是,在您的情况下,超时不是异步写入的,因此会阻止服务器响应,直到完成为止。

1.服务器启动时2.是1.服务器启动时2.是