304未修改意味着在控制台状态中意味着什么?

时间:2015-10-12 02:47:51

标签: node.js socket.io

我正在通过简单的聊天学习节点js。这是我的示例代码:

server.js

Bundle display name

的index.html

var mongo = require('mongodb').MongoClient,
    client = require('socket.io').listen(8888).sockets;

然后我重新启动节点服务器 然后我加载我的页面并检查控制台>网络标签

然后我访问socket.io的状态是这样的:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Node Chat System</title>
        <link rel="stylesheet" type="text/css" href="css/main.css" />
    </head>
    <body>
        <div class="chat">
            <input type="text" class="chat-name" placeholder="Enter your name" />
            <div class="chat-messages"></div>
            <textarea placeholder="Enter your message" ></textarea>
            <div class="chat-status">Status: <span>Idle</span></div>
            <script src="http://127.0.0.1:8888/socket.io/socket.io.js"></script>
        </div>
    </body>
</html>

在我的教程中它应该是

304 Not Modified

顺便说一句,我也在使用wampserver,当我停止所有进程时仍然会产生同样的效果。

你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

在您的特定情况下,node.js服务器只是告诉浏览器它的缓存版本socket.io.js没有过时,所以只需使用缓存中已有的版本。这是可缓存文件的正常预期浏览器行为。如果清除浏览器缓存,重新启动浏览器,然后重复此测试,第一次加载文件时,应该看到200状态(由于缓存为空,浏览器不会发出条件GET请求)。之后,一旦文件被缓存,你应该再次获得304。

304返回状态的说明就在规范中(也是Google搜索中的第一个结果):

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

  

10.3.5 304未修改

     

如果客户端执行了条件GET请求并且访问权限是   允许,但文件尚未修改,服务器应该   回复此状态代码。 304响应不得包含   message-body,因此始终由第一个空行终止   在标题字段之后。

     

响应必须包含以下标题字段:

  - Date, unless its omission is required by section 14.18.1 
     

如果无时钟源服务器遵守这些规则,并且代理和客户端将自己的日期添加到任何没有响应的响应中(如已经   由[RFC 2068]第14.19节规定,高速缓存将运行   正确。

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant 
     

如果条件GET使用了强缓存验证器(参见第13.3.3节),则响应不应包含其他   实体头。否则(即,条件GET使用弱   验证者),响应不得包含其他实体标题;这个   防止缓存的实体体之间的不一致和更新   头。

     

如果304响应表明当前没有缓存的实体,那么   缓存必须忽略响应并重复请求而不使用   有条件的。

     

如果缓存使用收到的304响应来更新缓存条目,那么   缓存必须更新条目以反映给定的任何新字段值   回应。

因此,简而言之,这意味着如果客户端执行了条件GET请求,那么服务器可以返回304,这意味着内容自上次请求后未被修改,这是服务器进行通信的一种方式回到客户端而不再发回内容。基本上,客户说“我想知道你是否有这个内容的更新版本,这里是我已经拥有的版本的元数据。如果你没有比我已有的更新的版本,那么只是返回304,否则请将新版本发送给我。“

而且,如果您想要对“条件GET请求”进行更多解释,可以在此处阅读:https://ruturajv.wordpress.com/2005/12/27/conditional-get-request/

更多细节

如果您清除浏览器缓存然后获取socket.io.js,您将看到200响应状态和响应标头,如下所示:

 ETag: xxxxx

然后,当您的浏览器下次请求该文件时,它将在请求中发送带有此标头的条件GET请求:

If-None-Match: xxxxx

其中xxxxx与两者中的字符串相同。

这是浏览器告诉服务器它已经有一个带有给定ETag的文件版本。然后服务器检查文件的版本是否是ETag。如果ETag匹配,则返回304.在这种情况下,ETag用作版本号。在某些情况下,它是文件的哈希值,但在socket.io.js的特定情况下,它实际上是一个版本号(因为服务器代码非常了解该特定文件)。

答案 1 :(得分:0)

我有类似的问题,我做了jfriend00建议,但它没有帮助。

我发现了以下内容 - 它不适用于Jerielle - 我希望它会帮助某人。

要避免此问题,只需打开以下链接(可选 - 请参阅下面的最后一段):

http://localhost:3000/socket.io/socket.io.js

(请将3000更改为您正在使用的内容)。

这将缓存socket.io.js

之后打开你需要打开的页面,第一次你应该得到200.不要再刷新页面 - 这样socket.io按预期工作 - 与服务器通信(至少在我的情况下)。 / p>

如果你点击刷新它会再次返回304 - 它可能与this有关 - 在这个过程中,我想,使用'If-Modified-Since',因此刷新返回304'未修改'

这意味着在大多数情况下,即使你得到304,socket.io也应该能够成功地与服务器通信(即使你没有点击上面的链接来缓存socket.io.js)。