我正在学习简单的聊天节点js。下面是我的示例代码:
server.js
var mongo = require('mongodb').MongoClient,
client = require('socket.io').listen(8888).sockets;
index.html
<!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>
然后重新启动节点服务器,然后加载页面并检查控制台> net选项卡。
然后,我在访问socket.io时的状态是:
304 Not Modified
在我的教程中应该是
200 Ok
顺便说一下,我也在使用wampserver,当我停止所有进程时,效果仍然相同。
你能帮我做这个吗?
发布于 2015-10-12 04:24:58
在您的具体情况下,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响应不能包含消息体,因此始终由标题字段之后的第一个空行终止。 响应必须包括以下头字段:
因此,简单地说,它意味着如果客户端执行了条件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的特定情况下,它实际上是一个版本号(因为服务器代码密切了解该特定文件)。
发布于 2018-03-06 19:01:52
我有类似的问题,我做了jfriend00的建议,但这没有帮助。
我发现了以下内容--这不是为Jerielle设计的--我希望它能帮助到别人。
为了避免这个问题,只需打开以下链接(它是可选的-参见下面最后一段):
http://localhost:3000/socket.io/socket.io.js
(请将3000换成您正在使用的)。
这将缓存socket.io.js
在那之后,打开你需要打开的页面,第一次你应该得到200。不要再次刷新页面-- socket.io按预期的方式工作--按它应该的方式与服务器通信(至少在我的例子中是这样)。
如果您再次单击refresh,它将返回304 --它可能与this有关--我猜,在此过程中使用‘If -修改’,因此刷新返回304‘未修改’。
这意味着在大多数情况下,socket.io应该能够成功地与服务器通信,即使您获得304 (即使您没有单击上面的链接来缓存socket.io.js)。
https://stackoverflow.com/questions/33072519
复制相似问题