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

min*_*iml 4 javascript node.js express

如果使用Javascript复制引用的对象,那么就快速克隆req,并res通过他们到每个请求处理之前的对象?如果没有,那么如何快速处理同时运行,并使用相同的参考路线之间可能发生的冲突reqres

joe*_*ews 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);
Run Code Online (Sandbox Code Playgroud)

测试curl:

$ curl localhost:8080
Run Code Online (Sandbox Code Playgroud)

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

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

它也不会通过多个路由运行单个请求 - 您可以添加另一个get("*")路由,您将看到它不会被调用.