Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS/Express:访问res.locals时出现并发问题_Node.js_Express - Fatal编程技术网

Node.js NodeJS/Express:访问res.locals时出现并发问题

Node.js NodeJS/Express:访问res.locals时出现并发问题,node.js,express,Node.js,Express,我有一个基于NodeJS、Express和Jade 4.13.4的web应用程序。在index.js中,我设置了如下路线: index.js var express=require('express')) ,app=express() ,companyroutes=require(“./routes/company”) (...) 应用程序使用(“/company/”,companyroutes) routes/company.js var express=require('express')

我有一个基于NodeJS、Express和Jade 4.13.4的web应用程序。在
index.js
中,我设置了如下路线:

index.js

var express=require('express'))
,app=express()
,companyroutes=require(“./routes/company”)
(...)
应用程序使用(“/company/”,companyroutes)
routes/company.js

var express=require('express'))
,router=express.router()
路由器.all(“/:id*”,函数(req、res、next){
res.locals.companyUri='/company/'+req.params.id;
异步并行([
//公司数据
功能(完成){
api.getCompany(req.params.id、req.user、done)
},
//用户跟踪数据
功能(完成){
api如下(请求参数id,请求用户“公司”,完成))
}
],
函数(错误、结果){
如果(错误){
返回下一个(错误)
}
res.locals.company=结果[0]
res.locals.userFollows=结果[1]
company.getCompanyOverview(res.locals.company,函数(err,results){
如果(错误){
返回下一个(错误)
}
调试('呈现公司概览')
res.render(“公司概述”,结果)
})
})
});
module.exports=路由器;
如您所见,我有一个单独的路由,用作中间件,执行以下操作:

  • 使用一些通用的公司数据丰富
    res.locals
    company
    userFollows
    从两个对API的异步并行调用接收)
  • 再次调用
    company.getCompanyOverview
    ,它使用
    async.parallel
    封装了对API的一些调用。接收到的数据存储在
    结果中
  • 使用
    结果
    呈现Jade视图
    公司概览
到目前为止还不错。对
http://localhost:3000/company/companyA
从API获取所有数据,并通过呈现模板正确显示
公司的数据

但是,对于并发请求,行为是不同的。我使用OSX下的ApacheBench请求另一家公司,从而在服务器上增加一些负载:

brew install parallel
echo /company/companyB | parallel 'ab -c 10 -n 5000 http://localhost:3000{}'
访问网站时
http://localhost:3000/company/companyA
使用浏览器,将显示
companyB
的基础数据,而不是
companyA

这清楚地表明,
res.locals
的范围是单个请求的生命周期:

包含作用域为的响应局部变量的对象 请求,因此仅对在 该请求/响应周期(如有)

然而,在我看来,ApacheBench的请求似乎正在覆盖
res.locals
。从另一台机器运行AB时也是如此

我已经在这方面投入了太多的时间,但我仍然不明白。这是Express中的错误还是我做错了什么

使用的版本

$ node -v
v4.2.2

$ npm list express
moneyhouse@1.1.1-dev.2 /Users/dani/Documents/mh-web
├─┬ browser-sync@2.13.0
│ └─┬ browser-sync-ui@0.6.0
│   └─┬ weinre@2.0.0-pre-I0Z7U9OV
│     └── express@2.5.11 
└── express@4.13.4 

$ npm list jade
moneyhouse@1.1.1-dev.2 /Users/dani/Documents/mh-web
├── jade@1.11.0 
└─┬ jade-glob-include@1.0.1
  └── jade@1.3.1 

我也经历了同样的错误。最终它看起来像是由我如何设置res.local引起的。 我有一个简单的=运算符

res.local.VALUE = req.VALUE.
“=”没有像您预期的那样分配变量,相反,它只引用req.VALUE,这意味着当并发请求进入并且req.VALUE更新时,该值可能会被交换

我通过克隆对象解决了这个问题:

res.local.VALUE = _.clone(req.VALUE) //using underscore

因此res.local.VALUE不再绑定到req,而是它自己的对象

尝试将
req
page result
打印到控制台,以处理每个请求A和B,例如
console.log(req.params.id,result[0],result[1],req.app.render('company-overview',results))
。如果打印的数据正确,则浏览器缓存中会出现问题,否则您可以看到问题的起因。这几乎总是由忘记声明的变量引起的,使其成为全局变量(每个请求都会覆盖该变量)。这不是Express中的错误。对于每个请求,
req
res
都是全新的对象,它们不会被其他请求重用,因此它们不会相互干扰。你可能解决了症状,但不是根本的问题。我也是这么想的。公平地说,我的解决方案还包括消除一些不必要的变量,这些变量可能会被错误地声明