Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点+;Express:Express是否克隆每个请求处理程序的req和res对象?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 节点+;Express:Express是否克隆每个请求处理程序的req和res对象?

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(

如果Javascript通过引用复制对象,那么Express是否会在将对象传递给每个请求处理程序之前克隆
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
这样的帮助程序库来实现这一点。或者更好的是,将代理反向到同一服务器的多个实例中。反向代理非常有助于负载平衡,但仍应避免在单节点进程中阻塞事件循环。