快速app.use刷新行为

时间:2017-04-07 20:30:45

标签: javascript node.js express

我正在使用Express和Node.js,我对刷新行为很困惑。刷新/test后,当它到达app.use时,似乎某些东西在服务器端缓存,因为数组长度非零(请参阅下面的示例代码)。我希望数组长度重置为零,因为当我刷新浏览器时,我再次点击/test

默认情况下,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 个答案:

答案 0 :(得分:1)

这不是真正的服务器缓存。这是因为您在闭包中注册中间件,因此保留了这些闭包变量(如arr),以便下次调用中间件。此外,您一遍又一遍地注册中间件(每次/test命中时都会使用新的中间件)。

当您在app.use()中注册app.get()时,这意味着每次您点击/test路线时,您都会添加另一个重复的app.use()处理程序。它们会随着时间的推移而累积,同一个中间件会针对同一个请求多次运行,保留arr之前的值,从最初注册时开始,但每个值都有自己的值。

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

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

如果您正在尝试回复您的ajax电话:

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

然后,您需要app.get('/data', ...)模块顶层的app才能完成这项工作。

请解释arr.push()应该为我们提供更多细节的帮助。