【问题标题】:Node + Express: Does Express clone the req and res objects for each request handler?Node + Express:Express 是否为每个请求处理程序克隆 req 和 res 对象?
【发布时间】:2015-10-13 04:36:50
【问题描述】:

如果 Javascript 通过引用复制对象,那么 Express 是否会在将 reqres 对象传递给每个请求处理程序之前克隆它们?如果不是,那么 Express 如何处理同时运行的路由之间可能存在的冲突,并使用对 reqres 的相同引用?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    Express 不会克隆 reqres。您可以在此示例应用中看到:

    var http = require('http');
    var express = require('express');
    
    var app = express();
    var testReq, testRes;
    
    app.use(function(req, res, next) {
      console.log('middleware');
      testReq = req;
      testRes = res;
      next();
    });
    
    app.get("*", function(req,res) {
      console.log('route')
      console.log('req the same? ' + (req === testReq)); // logs true
      console.log('res the same? ' + (res === testRes)); // logs true
    
      res.send(200);
    });
    
    
    http.createServer(app).listen(8080);
    

    curl测试:

    $ curl localhost:8080
    

    这是一个有用的功能——这意味着中间件函数可以使用reqres 将数据传递给下游函数。例如,授权中间件可能会添加 req.user 属性。

    这里不需要考虑并发性,因为 Node.js 是单线程的——不可能在任何给定时间运行两条路由。

    它也不会通过多个路由运行单个请求 - 您可以添加另一个 get("*") 路由,您会发现它不会被调用。

    【讨论】:

    • 那么,这是否意味着 node/express 中的路由被阻塞了?路由 A 中的昂贵计算是否会阻塞路由 B、C 和 D 的执行,是否应该收到新请求?
    • 不,Node 中的所有 I/O 默认情况下都是非阻塞的。这就是为什么这么多函数需要回调的原因——它们在操作完成时被异步调用。
    • 我错过了有关昂贵计算的部分 - 是的,受 CPU 限制的代码可能会阻塞。在调用堆栈之间拆分慢速计算是一种很好的做法。您可以使用setImmediate or process.nextTick 或像async 这样的帮助库来做到这一点。
    • 或者更好的是,反向代理到同一服务器的多个实例。
    • 反向代理非常适合负载平衡,但您仍应避免在单个 Node 进程中阻塞事件循环。
    【解决方案2】:

    由于 JavaScript 是单线程的,因此不会同时处理路由,也不存在多线程陷阱。 req & res 没有被克隆,它们被扩展了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多