我正在使用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'));
答案 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()
应该为我们提供更多细节的帮助。