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

Leo*_*ang 0 javascript node.js

假设我有以下代码。我正在使用 ExpressJS,但我认为服务器部分与普通 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();
});
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,第一个是readFileSync在服务器启动时运行一次,还是在服务器每次收到请求时运行?

对于第二个readFileSync,它是否会阻止 Node 处理其他请求?换句话说,所有其他请求是否都必须等到readFileSync完成才能 Node 处理它们?

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

bry*_*mac 5

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

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

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

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