在异步环境中保持节点功能参数安全

时间:2016-10-11 15:53:45

标签: javascript node.js

这一直困扰着我,我似乎无法找到答案。

这是Node函数的一种形式,我经常使用它,它处理Web请求并执行一些IO:

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

调用此函数并将res参数设置为当前响应对象并进入IO域,而在其中播放第二个请求并将res设置为新对象?现在第一个请求从IO返回,并使用res对象,这是第一个实例还是第二个实例,即每次调用handleRequest函数时,节点本质上都是对所有内容进行单独复制,具有自己的参数值或者是否存在只有它的一个实例及其参数?以上函数中的参数是否在异步环境中是安全的,或者更好地执行以下操作:

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

或者我完全不知道Node和Java Script是如何工作的,这似乎很可能。

3 个答案:

答案 0 :(得分:2)

你根本不必担心这个案子。 req对象包含有关服务器收到的HTTP请求的信息。根据要求,所有东西都是沙盒。这对您有所帮助:What are "res" and "req" parameters in Express functions?

答案 1 :(得分:0)

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

如果您不熟悉JavaScript和/或闭包概念,那可能就是您对语法感到不安的原因。

答案 2 :(得分:0)

对函数handleRequest()的每次调用都不会使用之前调用handleRequests()的相同变量值。查看此行为的简单方法是记录调用方法的次数,以及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))
    }

您应该注意到,无论您每次通话的速度有多快,每次拨打端点的次数都会增加1次(为比赛条件做好准备)。