如何在Express JS + Node JS中禁用网站缓存?

时间:2014-03-25 11:03:06

标签: node.js caching express browser-cache

默认情况下,我的浏览器会缓存ExpressJS应用的网页。

这导致我的登录系统出现问题(未登录的用户可以打开登录用户的旧缓存页面)。

如何禁用此缓存?

编辑:

我的app.js(主文件):

var express = require('express');
var http = require('http');
var path = require('path');

var store = require('./routes/store');
var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3012);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', store.home);
app.post('/', store.home);



app.get('/addProblem', store.addProblem);
app.post('/addProblem', store.addProblem);

app.get('/problem', store.problem);
app.post('/problem', store.problem);

app.get('/problemList', store.problemList);
app.post('/problemList', store.problemList);

app.get('/main', store.main);
app.post('/main', store.main);

app.post('/login', store.login);
app.get('/login', store.login);

app.get('/createProblem', store.createProblem);
app.post('/createProblem', store.createProblem);

app.post('/register', store.register);
app.get('/register', store.register);

app.post('/evaluate', store.evaluate);
app.get('/evaluate', store.evaluate);

app.get('/logout', store.logout);
app.post('/logout', store.logout);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

3 个答案:

答案 0 :(得分:4)

app.disable('view cache');

^^ ExpressJS代码

答案 1 :(得分:3)

在Express.js中处理缓存时,需要考虑两件事-id%2F标头。

ETag MDN reference
如果您有不能从ETags中受益的动态内容,则最好将其禁用,因为它会导致每次请求产生少量开销。

%2F

缓存控制MDN reference
要完全禁用缓存,请使用以下标头:

id

此标头不影响ETag中间件。它以自己的方式处理缓存。

答案 2 :(得分:2)

nocache

不要浪费时间重新发明轮子,请使用nocache middleware

安装:

npm install --save nocache

然后将其添加到您的应用中:

const nocache = require('nocache');

app.use(nocache());

(通过文档)它很容易工作:

  

这设置了四个标题,从而禁用了许多浏览器缓存:

     
      
  • 缓存控制:不存储,不缓存,必须重新验证,代理重新验证
  •   
  • 编译指示:无缓存
  •   
  • 有效期:0
  •   
  • 代理控制:无需存储
  •   

Etag

当心ETag:使用上面的中间件的此标头isn't removed,因为它的工作方式不同。它是在请求结束时生成的,因此有两种选择。

app.set

使用快速内置app.set('etag', false);方法将其禁用

标题

在使用on-headers module将标头发送给客户端之前删除标头:

const onHeaders = require('on-headers');

// install it as a middleware
app.use((req, res, next) => {
    // listen for the headers event
    onHeaders(res, () => {
        this.removeHeader('ETag');
    });
});