Javascript Node.js服务器如何处理请求?
假设我有以下代码。我使用的是ExpressJS,但我认为服务器部分与vanilla 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
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.是