节点js使用promise在post请求中变量作用域

时间:2018-04-15 03:58:36

标签: node.js post promise

app.post('/', function (req, res) {
     var foo = req.body + "";
     someFunction(foo).promise()
     .then(function(){
          res.set('Content-Type', 'text/plain');
          res.send(foo);
     });

})

我做了一个如上所示的简单例子。我想知道,如果我有很多来自客户的 POST 请求,可能会同时 req.body 更改每个, res.send(foo) 中的foo 导致错误的响应发送给发布此内容的原始客户端?因为 foo 在每个上下文中都在发生变化,所以这会导致响应客户端发送错误的值吗?

如果客户A发送" Hello"当许多其他客户发送不同的字符串时,客户A会保证接收" Hello"来自服务器的回应?如果不能保证,我怎么能在 .then(function(){}) 中没有参数的情况下解决这个问题?

1 个答案:

答案 0 :(得分:1)

每个req对象对于每个请求都是唯一的。因此,来自一个请求的req对象与来自另一个请求的req对象之间没有任何关联,另一个请求所发生的事情不会影响此req对象。每个请求处理函数范围对于每个请求也是独立的。

您必须确保someFunction()所做的不使用任何共享变量,以免它导致任何并发问题,但您在此处显示的代码本身不会导致任何并发问题。

此外,foo是一个局部变量,它仅对请求处理程序的这种调用是本地的。另一个请求将具有不同的函数范围和不同的变量foo

  

如果客户A发送" Hello"当许多其他客户发送不同的字符串时,客户A会保证接收" Hello"来自服务器的回应?

是的,我们会保证得到正确的答复。这不是您需要担心的问题。

如果在更高的范围(例如模块范围或全局范围)中声明了foo,因此可以从每个请求处理程序访问完全相同的变量,那么就会出现问题。只要变量是请求处理程序范围的本地变量或req对象中的属性,就没有问题。