如何提供具有禁用缓存的文件?

时间:2013-07-09 17:24:14

标签: javascript node.js cache-control

我正在创建一个动态的node.js网站。我不希望浏览器存储页面,即每当用户点击重新加载时我希望页面从头开始重新加载。目前我的页面似乎仍然被缓存,即使我发送“Cache-Control”:“no store”。这是我的服务器:

// requires node's http module
var http=require('http');
var url=require('url');
var fs=require('fs');
// creates a new httpServer instance
http.createServer(function (req, res) {
// this is the callback, or request handler for the httpServer
log('in server callback')
res.ins=res.write;

var parse=url.parse(req.url,true);
var path0=parse.pathname;
var mime=core.getMime(path0)
console.log(path0)
// respond to the browser, write some headers so the 
// browser knows what type of content we are sending

var servePage=function(){
    var path='./page'+path0+'.js'
    console.log(path)
    fs.exists(path,function(e){
        if(e){
            log('serving page')
            var exp=require(path); 
            if(exp && exp.html){
                var html=exp.html
            }
            else{
                var html='bad file'
            }
        }
        else{
            console.log('no page to serve')
            var exp=require('./page/pageHome.js')
            var html=exp.html
        }
        res.writeHead(200, {'Content-Type': mime, 'Cache-Control': 'no store'});
        res.ins(html);
        res.end();
    })
}
servePage()
}).listen(8080); // the server will listen on port 8080

我还尝试使用随机查询字符串(例如“http://mydomain.com/page?q=42”)创建自我链接,但这仍然没有绕过缓存。我究竟做错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

你这样做通常是错误的。

请阅读require。它用于加载node.js的模块并执行它。不是通过http实际为请求提供文件 require将始终缓存执行结果并保留模块的引用,您必须手动清除它 - 但如上所述,这不是您的情况。

请阅读这篇精彩文章:Nodejs send file in response,介绍如何通过node.js发送文件。

您也可以为它设置no-cache标头,但这是一种做事的“坏方法”。您最好不要触摸任何标题,并在前端进行额外查询,但即使并非总是如此。

res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');