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

时间:2015-07-23 21:36:23

标签: 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.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完成?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

你是对的。首次启动服务器时,您的第一个readFileSync将执行一次。

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