在异步环境中保证Node函数参数的安全

Keeping Node function parameters safe in an async environment

本文关键字:函数 参数 安全 Node 异步 环境      更新时间:2023-09-26

这是一件一直困扰着我的事情,我似乎找不到一个直接的答案。

这是我经常使用的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是如何工作的,这似乎很有可能。

您完全不必担心这种情况。req对象包含有关服务器接收到的HTTP请求的信息。所有内容都以每个请求为基础进行沙盒处理。这将对你有所帮助:什么是"资源";和";req"参数在Express函数?

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

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

每次调用函数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(为竞争条件做好准备)。