【发布时间】:2015-10-13 04:36:50
【问题描述】:
如果 Javascript 通过引用复制对象,那么 Express 是否会在将 req 和 res 对象传递给每个请求处理程序之前克隆它们?如果不是,那么 Express 如何处理同时运行的路由之间可能存在的冲突,并使用对 req 和 res 的相同引用?
【问题讨论】:
标签: javascript node.js express
如果 Javascript 通过引用复制对象,那么 Express 是否会在将 req 和 res 对象传递给每个请求处理程序之前克隆它们?如果不是,那么 Express 如何处理同时运行的路由之间可能存在的冲突,并使用对 req 和 res 的相同引用?
【问题讨论】:
标签: javascript node.js express
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("*") 路由,您会发现它不会被调用。
【讨论】:
setImmediate or process.nextTick 或像async 这样的帮助库来做到这一点。
由于 JavaScript 是单线程的,因此不会同时处理路由,也不存在多线程陷阱。 req & res 没有被克隆,它们被扩展了。
【讨论】: