保持节点function参数在asynchronous环境下安全

这是一直困扰着我,我似乎无法find一个直接的答案。

下面是一个Node函数的一种forms,我使用了很多,它处理一个Web请求并执行一些IO操作:

function handleRequest(req, res) { doSomeIo() .then(function(result) { res.send(result) }) } 

这个函数被调用,并且res参数被设置为当前的响应对象,并且它进入IO的域,当它播放出第二个请求时,将res设置为一个新的对象。 现在,第一个请求从IO返回,并使用res对象,这是现在的第一个实例还是第二个,ie节点本质上每次调用handleRequest函数时都会创build一个独立的副本,并带有自己的参数值或者是否存在它只有一个实例和它的参数? 上述函数中的参数是否在asynchronous环境中是安全的,还是应该这样做:

 function handleRequest(req, res) { doSomeIo() .then(function(res) { return function(result) { res.send(result) } }(res)) } 

还是我完全不知道Node和Java Script如何工作,这看起来很可能。

你根本不必担心这个情况。 req对象包含有关服务器收到的HTTP请求的信息。 一切都是在每个请求的基础上沙盒。 这将对您有所帮助: Expressfunction中的“res”和“req”参数是什么?

你可以期望当前的req和res对象在多个事件(I / O响应本质上是事件)中保持一致,除非你对它们做了某些事情,或者你有其他的中间件做了一些事情。 没有必要做任何事情像你的第二个代码片段。

如果你不熟悉JavaScript和/或闭包的概念,那可能就是为什么你对语法感到不安。

每个对函数handleRequest()调用都不会使用之前调用handleRequests()的相同variables值。 查看这种行为的简单方法是logging调用方法的次数,以及handleRequest()增量的值。

例:

在app.js(或任何js文件初始化您的服务器)中,添加以下内容:

 var app = express(), calls = 0; app.set('calls', calls); 

然后在你的处理程序中添加以下内容

 function handleRequest(req, res) { doSomeIo() .then(function(res) { req.calls++; return function(result) { res.send(req.calls) } }(res)) } 

您应该注意,无论您每次打电话的速度如何,terminal的每次呼叫都会计数每次增加1(准备好竞赛条件)。