Node + Express:Express是否会为每个请求处理程序克隆req和res对象?

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

8

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时,它们的执行会被阻塞吗? - miniml
不,Node中的所有I/O默认都是非阻塞的。这就是为什么许多函数需要回调函数 - 它们在操作完成时异步调用。 - joews
我错过了关于昂贵计算的部分 - 是的,CPU绑定代码可能会阻塞。将缓慢的计算拆分到调用堆栈中是一个好的实践。您可以使用setImmediateprocess.nextTick或像async这样的辅助库来实现。 - joews
或者更好的做法是,将反向代理转发到多个相同服务器实例。 - Amit
反向代理非常适用于负载均衡,但您仍应避免在单个Node进程中阻塞事件循环。 - joews

2
由于JavaScript是单线程的,因此不存在同时处理路由和多线程的问题。 reqres不会被克隆,它们会被扩展。

0
当我们说“并行请求”时,意味着客户端正在创建一个连接流,并以request或其他你命名的形式提供它。
一系列的中间件将按顺序逐个获取它,基于对next的调用,同时从中间件中附加必要的内容。
但是router.all/*('path', [middleware])会触发客户端发出的每个请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接