在javascript中关闭缓存

在javascript中关闭缓存,javascript,node.js,caching,Javascript,Node.js,Caching,大家好,我正试图关闭缓存 向随请求消息一起发送的URL的查询字符串组件添加随机值 我有一个服务器,它将etag作为字符串发送到我的客户端,我想确保没有缓存正在进行,我已经设置了RequestHeaders,但我还应该添加一个类似于POST/message?x=0.123456789 http/1.1的http请求 这是我的客户代码 <html> <header><title>This is title</title></header>

大家好,我正试图关闭缓存 向随请求消息一起发送的URL的查询字符串组件添加随机值

我有一个服务器,它将etag作为字符串发送到我的客户端,我想确保没有缓存正在进行,我已经设置了RequestHeaders,但我还应该添加一个类似于POST/message?x=0.123456789 http/1.1的http请求

这是我的客户代码

<html>
<header><title>This is title</title></header>
<body>
<span id="ajaxButton" style="cursor: pointer; text-decoration: underline">
  Make a request
</span>
<script type="text/javascript">
(function() {
  var httpRequest;
  var x= Math.random();
  document.getElementById("ajaxButton").onclick = function() { makeRequest('http://localhost:5000/'); };
  function makeRequest(url) {
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
      try {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) {
        try {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (e) {}
      }
    }
    if (!httpRequest) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }
    httpRequest.onreadystatechange = alertContents;
    httpRequest.open('GET', url, true);
    //httpRequest.setRequestHeader("pragma", "no-cache");
    //httpRequest.setRequestHeader("Cache-Control", "no-cache", "no-store"); 
    httpRequest.send();

  }
  function alertContents() {
    if (httpRequest.readyState === 4) {
      if (httpRequest.status === 200) {
        var etagString = httpRequest.responseText;
        alert(etagString);
      } else {
        alert('There was a problem with the request.');
      }
    }
  }
})();
</script>
</body>
</html>
使用node.js我使用main.js运行服务器

var http = require('http');
var domain = require('domain');
var root = require('./root'); // do I have to replace root w/ message 
var image = require('./image');  // for better readability?


function replyError(res) {
  try {
    res.writeHead(500);
    res.end('Server error.');
  } catch (err) {
    console.error('Error sending response with code 500.');
  }
};

function replyNotFound(res) {
  res.writeHead(404);
  res.end('not found');
}

function handleRequest(req, res) {
  console.log('Handling request for ' + req.url);
  if (req.url === '/') {
    root.handle(req, res);
  }
  if (req.url === '/image.png'){
    image.handle(req, res);
  } 
  else {
    replyNotFound(res);
  }
}



var server = http.createServer();

server.on('request', function(req, res) {
  var d = domain.create();
  d.on('error', function(err) {
    console.error(req.url, err.message);
    replyError(res);
  });
  d.run(function() { handleRequest(req, res)});
});

function listen(){
server.listen(5000);
}

root.init(listen);
而root.js的内部是

var http = require('http');
var response = require('./response');
var body;
var etag;



exports.handle = function(req, res) {
  if (req.headers['if-none-match'] === etag) {
    console.log('returning 304');
    return response.replyNotModified(res);
  } 
  res.writeHead(200, {'Content-Type': 'text/plain',
  'Content-Length': body.length,
  "Access-Control-Allow-Origin":"*",
  "Access-Control-Allow-Headers":"X-Requested-With",
  'ETag' : etag
  }); 
  res.end(body);   
}


exports.init = function(cb) {
  require('fs').readFile('app.html', function(err, data) {
    if (err) throw err;
    etag = response.generateETag(data); //
    body = etag;
    console.log("init");
    cb();
  });
}

/*function generateETag(buffer) {   
  var shasum = require('crypto').createHash('sha1');
  shasum.update(buffer, 'binary'); 
  return shasum.digest('hex');    
  console.log(shasum.digest('hex'));
}
var replyNotModified = function(res) {
  res.writeHead(304);
  res.end();
};*/
错误在

中,您可以添加“=”+new Date.getTime;指向url的查询字符串。由于不清楚url是否已经附加了查询字符串,因此很难给出更完整的答案。它可以是url+='?='+new Date.getTime;或者url+='&='+new Date.getTime

我将这个答案留在这里,因为它似乎回答了OP提出的问题。但是OP遇到的问题的解决方案是Adam Brenecki在下面给出的答案。

您可以添加“=”+new Date.getTime;指向url的查询字符串。由于不清楚url是否已经附加了查询字符串,因此很难给出更完整的答案。它可以是url+='?='+new Date.getTime;或者url+='&='+new Date.getTime


我将这个答案留在这里,因为它似乎回答了OP提出的问题。但是OP遇到的问题的解决方案是Adam Brenecki在下面给出的答案。

因此,您遇到的错误与跨源资源共享有关,而跨源资源共享与缓存或查询字符串无关。看起来您正试图从文件://url进行AJAX调用,但这是无法做到的

如果您从Node.js应用程序提供有问题的页面,该消息应该会消失

如果您无法做到这一点,请将该应用程序设置为发送CORS头。您可以,但简短的版本是,您需要发送一个标题,该标题类似于网页所在的otherdomain.com:

Access-Control-Allow-Origin: http://otherdomain.com

注意,您仍然需要通过HTTP提供页面服务;据我所知,您根本无法从通过文件http://URL加载的页面执行AJAX操作。

因此,您遇到的错误与跨源资源共享有关,而跨源资源共享与缓存或查询字符串无关。看起来您正试图从文件://url进行AJAX调用,但这是无法做到的

如果您从Node.js应用程序提供有问题的页面,该消息应该会消失

如果您无法做到这一点,请将该应用程序设置为发送CORS头。您可以,但简短的版本是,您需要发送一个标题,该标题类似于网页所在的otherdomain.com:

Access-Control-Allow-Origin: http://otherdomain.com


注意,您仍然需要通过HTTP提供页面服务;据我所知,你根本无法从一个通过文件://URL加载的页面执行AJAX。

那么你的问题是什么?我如何添加一个随机值?如何使用math.random添加一个随机值你说它会抛出错误,但你没有向我们提供这些错误。如果您给我们一些日志输出或控制台输出,以便我们在使用math.random函数时可以看到它们是什么,这会有所帮助。您使用哪个url访问发出此请求的页面?在我看来,这是一个跨域问题。我添加了错误。我是否也应该添加我的服务器端js代码?那么你的问题是什么?我如何添加一个随机值?使用math.random添加一个随机值。你说它会抛出错误,但你没有向我们提供这些错误。如果您给我们一些日志输出或控制台输出,以便我们在使用math.random函数时可以看到它们是什么,这会有所帮助。您使用哪个url访问发出此请求的页面?在我看来,这是一个跨域问题。我添加了一个错误,我应该也添加我的服务器端js代码吗?这是否在httpRequest.openPOST中出现,'url_='+东西,true;我听说我必须使用POST如果你要去POST,你应该使用POST,或者GET for GET。我正试着从你提供的样品和我对你的问题的最佳答案中拼凑出来。看起来你要问的问题的关键是如何防止缓存响应,不是吗?@RyanWilliams你不必使用POST。GET也可以很好地工作。这完全取决于你对使用POST还是GET的要求。@JonTaylor。。。但是如果你想发帖的话,你确实需要使用POST,不是吗?如果这是真正需要的,那么要发布一篇帖子,OP可以在这里查看:@jameslafferty是的,当然,我只是说他的问题似乎是关于防止缓存,这与GET或POST无关。他会得到我们两人的相同行为。这是否在httpRequest.openPOST中出现,'url_='+之类的东西,是真的;我听说我必须使用POST如果你要去POST,你应该使用POST,或者GET for GET。我正试着从你提供的样品和我对你的问题的最佳答案中拼凑出来。看起来你要问的问题的关键是如何防止缓存响应,不是吗?@RyanWilliams你不必使用POST。GET也可以很好地工作。
这完全取决于你对使用POST还是GET的要求。@JonTaylor。。。但是如果你想发帖的话,你确实需要使用POST,不是吗?如果这是真正需要的,那么要发布一篇帖子,OP可以在这里查看:@jameslafferty是的,当然,我只是说他的问题似乎是关于防止缓存,这与GET或POST无关。如果我去掉math.random,只使用makeRequest,它会正确地提醒httpRequest.responsetext这不是一个ajax请求吗?我如何从你的Node.js提供有问题的页面app@RyanWilliams好的,这很有趣。如果你改变了你的想法会怎么样http://localhost:5000“所以它说”http://localhost:5000/'注意后面的斜杠吗?如果我注释掉httpRequest.SetRequestHeaderFragma,则没有缓存;httpRequest.setRequestHeaderCache-Control,无缓存,无存储;ajax按钮将正确显示带有alertetagstring的etag。是否有办法从http:/localhost/而不是file://运行我的文件,而不使用wamp,只使用node.js和代码?您需要将内容类型设置为text/html,否则Chrome会认为它是一个纯文本文件。如果我去掉math.random,只使用makeRequest,它会正确地提醒httpRequest.responsetext这不是一个ajax请求吗?我将如何从你的Node.js提供有问题的页面app@RyanWilliams好的,这很有趣。如果你改变了你的想法会怎么样http://localhost:5000“所以它说”http://localhost:5000/'注意后面的斜杠吗?如果我注释掉httpRequest.SetRequestHeaderFragma,则没有缓存;httpRequest.setRequestHeaderCache-Control,无缓存,无存储;ajax按钮将正确显示带有alertetagstring的etag。是否有办法从http:/localhost/而不是file://运行我的文件,而不使用wamp,只使用node.js和代码?您需要将内容类型设置为text/html,否则Chrome会认为它是纯文本文件。