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

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

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); 

curltesting:

 $ curl localhost:8080 

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

并发在这里不是一个问题,因为Node.js是单线程的 – 在任何给定的时间都不可能运行两条路由。

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

由于JavaScript是单线程的,因此没有同时进行的路由处理,并且不存在multithreading陷阱。 reqres不克隆,它们被扩展。