在异步环境中保证Node函数参数的安全
Keeping Node function parameters safe in an async environment
这是一件一直困扰着我的事情,我似乎找不到一个直接的答案。
这是我经常使用的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(为竞争条件做好准备)。
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数