如果Javascript通过引用复制对象,那么Express会在将res
和req
对象传递给每个请求处理程序之前克隆它们吗?如果没有,那么Express如何处理同时运行的路由与使用res
和{{1}}的相同引用之间的可能冲突?
答案 0 :(得分:6)
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("*")
路线,您将看到它不会被调用。
答案 1 :(得分:2)
由于JavaScript是单线程的,因此不存在同时路由处理,也不存在多线程陷阱。 req
& res
未被克隆,它们被扩展。