繁体   English   中英

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

[英]How does a Node.js server process requests?

假设我有以下代码。 我正在使用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();
});

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

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

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

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

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

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

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

没错 首次启动服务器时,您的第一个readFileSync将执行一次。

每次收到请求时都会发生第二次readFileSync ,但是由于它存在于res.end()的回调中(请记住res.end()本质上是非阻塞的),因此您可以在非阻塞状态下接收任意数量的请求只要您的内部函数也被编写为非阻塞的(例如,具有回调),它就会流行。 但是,就您而言,超时不是异步写入的,因此将阻止服务器响应,直到完成为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM