Node.js POST请求Promise场景下的变量作用域问题
Express并发POST请求中
res.send(foo)会返回错误响应吗? 我写了一段Express的POST接口代码:
app.post('/', function (req, res) { var foo = req.body + ""; someFunction(foo).promise() .then(function(){ res.set('Content-Type', 'text/plain'); res.send(foo); }); })
现在有个疑问:当大量客户端同时发POST请求,每个请求的req.body都不一样,res.send(foo)里的foo会不会导致给原始客户端返回错误的响应?毕竟每个请求上下文的foo值都在变...
放心,完全不会出现返回错误响应的情况,原因其实和JavaScript的作用域机制以及Express的请求处理逻辑直接相关:
- 首先,Express对每个进来的请求,都会单独调用一次你定义的这个回调函数(
function (req, res) {...})。也就是说,每个请求对应一个独立的函数执行上下文,里面的foo是这个上下文里的局部变量——不同请求的foo属于完全独立的内存空间,互相不会产生干扰。 - 其次,
then回调里的foo是通过闭包捕获了当前请求上下文里的那个foo值。哪怕someFunction的异步操作需要耗时,等到then执行的时候,它拿到的依然是当前请求对应的req.body转换后的foo,不会被其他请求的foo覆盖。
举个直观的例子:假设请求1的req.body是"hello",请求2的是"world",它们几乎同时到达。这时候会生成两个独立的回调执行实例,各自的foo分别是"hello"和"world"。当各自的someFunction异步完成后,then回调里的res.send(foo)只会发送自己上下文里的那个值,请求1拿到"hello",请求2拿到"world",完全不会串值。
简单总结:每个请求的所有变量都被作用域严格隔离,异步回调也会保留当前请求的上下文,所以完全不用担心并发下的变量污染问题。
内容的提问来源于stack exchange,提问作者Rekd
相关产品推荐
相关产品推荐

