我正在通过简单的聊天学习节点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,当我停止所有进程时仍然会产生同样的效果。
你能帮我解决这个问题吗?
答案 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)。