【问题标题】:Keeping Node function parameters safe in an async environment在异步环境中保持 Node 函数参数的安全
【发布时间】:2017-02-20 05:55:50
【问题描述】:

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

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

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

这个函数被调用并且 res 参数被设置为当前响应对象并且它进入 IO 的土地,而它在那里播放第二个请求通过并将 res 设置为一个新对象?现在第一个请求从 IO 返回,并使用 res 对象,这是现在的第一个实例还是第二个 ie 每次调用 handleRequest 函数时,节点本质上都会为所有内容制作一个单独的副本,使用它自己的参数值还是存在只有一个实例及其参数?上述函数中的参数在异步环境中是否安全,或者这样做会更好:

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

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

【问题讨论】:

  • 为什么第二个请求会替换您在函数中引用的请求?您的函数永远不会丢失对原始请求的引用。每当有新请求进来时,就会创建一个新对象,而不会干扰任何其他对象。
  • 感谢您的确认,我担心我可能正在编写不安全的代码并且无法找到任何确认方式。这也适用于局部函数变量还是仅适用于参数?
  • 两者。实际上,您可以将参数视为在函数声明中声明的局部变量。相同的范围规则适用于它们。
  • 谢谢大家的帮助,我感觉舒服多了。
  • 很高兴我能帮上忙 :)

标签: javascript node.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您完全不必担心这种情况。 req 对象包含有关服务器接收到的 HTTP 请求的信息。一切都在每个请求的基础上进行沙盒化。这将对您有所帮助:What are "res" and "req" parameters in Express functions?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-28
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 2018-09-05
        相关资源
        最近更新 更多