Javascript 节点+;Express:Express是否克隆每个请求处理程序的req和res对象?
如果Javascript通过引用复制对象,那么Express是否会在将对象传递给每个请求处理程序之前克隆Javascript 节点+;Express:Express是否克隆每个请求处理程序的req和res对象?,javascript,node.js,express,Javascript,Node.js,Express,如果Javascript通过引用复制对象,那么Express是否会在将对象传递给每个请求处理程序之前克隆req和res对象?如果不是,那么Express如何处理同时运行的路由之间的可能冲突,并使用对req和res的相同引用?由于JavaScript是单线程的,因此不存在同步路由处理和多线程陷阱req和res不是克隆的,而是扩展的。Express不克隆req和res。您可以在本示例应用程序中看到: var http = require('http'); var express = require(
req
和res
对象?如果不是,那么Express如何处理同时运行的路由之间的可能冲突,并使用对req
和res
的相同引用?由于JavaScript是单线程的,因此不存在同步路由处理和多线程陷阱req
和res
不是克隆的,而是扩展的。Express不克隆req
和res
。您可以在本示例应用程序中看到:
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
这是一个有用的功能-这意味着中间件功能可以使用req
和res
将数据传递给下游功能。例如,授权中间件可能会添加req.user
属性
并发性在这里不是一个问题,因为Node.js是单线程的——在任何给定时间都不可能运行两条路由
它也不会通过多个路由运行单个请求-您可以添加另一个
get(“*”
路由,您将看到它不会被调用。那么,这是否意味着node/express中的路由正在阻塞?如果出现新请求,路由A中昂贵的计算是否会阻止路由B、C和D的执行?否,默认情况下,节点中的所有I/O都是非阻塞的。这就是为什么这么多函数都会进行回调——它们是在操作完成后异步调用的。我错过了关于昂贵计算的部分——是的,CPU限制的代码可能会阻塞。在调用堆栈中分割慢速计算是一种很好的做法。您可以使用或像async
这样的帮助程序库来实现这一点。或者更好的是,将代理反向到同一服务器的多个实例中。反向代理非常有助于负载平衡,但仍应避免在单节点进程中阻塞事件循环。