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

时间:2015-10-12 18:24:15

标签: javascript node.js express

如果Javascript通过引用复制对象,那么Express会在将resreq对象传递给每个请求处理程序之前克隆它们吗?如果没有,那么Express如何处理同时运行的路由与使用res和{{1}}的相同引用之间的可能冲突?

2 个答案:

答案 0 :(得分:6)

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("*")路线,您将看到它不会被调用。

答案 1 :(得分:2)

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