这一直困扰着我,我似乎无法找到答案。
这是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是如何工作的,这似乎很可能。
答案 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次(为比赛条件做好准备)。