2017-04-07 62 views
0

我正在使用Express与Node.js,并对刷新行为很困惑。在刷新/test时,由于数组长度不为零(见下面的示例代码),因此在刷新/test时,似乎某些东西在服务器端缓存时出现app.use。我期望数组长度重置为零,因为我在刷新浏览器时再次打到/test快速app.use刷新行为

app.use默认情况下缓存的东西? Express中间件如何在刷新方面工作?我无法在Express 4.14文档中找到任何明确解释的内容。

==================

浏览器端点:localhost:8000/test

客户:

$.get('/data').done(function(response){...} 

路线:

module.exports = function(app) { 
    app.get('/test', function(req,res) { 
    var arr =[]; 
    app.use('/data', function(req,res, next) { 
     console.log(arr.length); // this is nonzero on refresh 
     arr.push(/* some stuff*/); 
     res.send({"arr": arr}); 
    } 
    res.render('test.html') 
    } 
} 

服务器:

var express = require('express'); 
var app = express(); 

require('./routes/route')(app); 
app.set('views',__dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.engine('html', require('ejs').renderFile); 

var server = app.listen(8000, function() { 
    console.log("server started 8000"); 
}); 
app.use(express.static(__dirname + '/public')); 
+1

Express中间件应该只在应用程序的开始处定义一次,而不是针对每个请求。 – robertklep

回答

1

这不是真正的服务器缓存。这是因为你在一个闭包中注册了中间件,因此这些闭包变量(如arr)被保留下来调用中间件。另外,你一次又一次地注册中间件(每次碰到一个新中间件/test)。

当您注册app.use()app.get()这意味着你每次打/test路线的时候,你会再添重复app.use()处理程序中。随着时间的推移,它们将累积,并且相同的中间件会针对相同的请求多次运行,保留原始注册时的arr的先前值,但每个中间件都具有它们自己的数组值。

这里的一般解决方案是不要在app.get()里注册app.use(),因为你只需要一个处理程序 - 你不想让它们累积。


目前还不清楚你想用你的app.use('/data/, ...)中间件来完成什么。很明显,你目前的结构是错误的,但是如果你不知道你想要做什么,那么它应该如何写就不清楚。中间件的通常功能是在服务器初始化期间注册一次,而不要在请求处理程序中注册。


如果你想你的Ajax调用回应:

$.get('/data').done(function(response){...} 

然后,你会希望有一个app.get('/data', ...)app模块的顶部水平,使这项工作。


请解释一下什么是arr.push()应该完成我们在任何更详细的帮助。

+0

@Bethany - 这是否回答你的问题?如果是这样,您可以通过点击答案左侧的绿色复选标记来向社区表明这一点,并且这将为您遵循正确的程序赢得一些声望点。 – jfriend00

+0

非常感谢你的彻底回应!我对Express/Middleware的工作原理不是很熟悉,很高兴知道它应该放在顶层。 我实际上想维护这个代码的功能,因为它正在工作(刷新时,我不想清除数组)。我会研究会议等来实现这一目标。再次感谢! – Bethany

+1

@Bethany - 是的,看起来创建一个用户会话对象并将该数组放入该用户特定的会话可能就是您要做的。 – jfriend00