Node.js 在控制台状态下,304未修改意味着什么?

Node.js 在控制台状态下,304未修改意味着什么?,node.js,socket.io,Node.js,Socket.io,我正在通过简单的聊天学习NodeJS。以下是我的示例代码: 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">

我正在通过简单的聊天学习NodeJS。以下是我的示例代码:

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>
在我的教程中应该是

200 Ok
顺便说一下,我也在使用wampserver,当我停止所有进程时,效果仍然相同


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

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


规范中有304返回状态的描述(也是谷歌搜索的第一个结果):

10.3.5未修改304

如果客户机执行了条件GET请求,则访问被取消 允许,但文档尚未修改,服务器应 使用此状态代码进行响应。304响应不能包含 消息体,因此始终由第一个空行终止 在标题字段之后

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

  - 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 
如果使用强缓存验证器(见第13.3.3节),则响应不应包括其他内容 实体标题。否则(即,使用弱 验证程序),响应不得包含其他实体标头;这 防止缓存实体和更新实体之间的不一致 标题

如果304响应指示当前未缓存的实体,则 缓存必须忽略响应并在没有响应的情况下重复请求 有条件的

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

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

而且,如果您想对“条件GET请求”进行更多解释,可以在此处阅读:


更多细节

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

 ETag: xxxxx
然后,下次浏览器请求同一文件时,它将发送一个条件GET请求,请求中包含以下标题:

If-None-Match: xxxxx
其中,
xxxxx
在两者中是相同的字符串


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

我也有类似的问题,我按照jfriend00的建议做了,但没有帮助

我发现了以下几点——这不是为Jerielle准备的——我希望它能帮助一些人

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

(请将3000换成您正在使用的)

这将缓存socket.io.js

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

如果您再次点击refresh,它将返回304-可能与此有关-我猜,在这个过程中,使用“If Modified Since”,因此refresh返回304“Not Modified”


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

您是否更改了index.html?您更改了什么意思?
您更改了吗?
?304只是意味着服务器不会认为您的缓存内容过时。这是一种优化尝试(不是重新发送内容,而是说“缓存中的内容没问题”)。我想知道是否真的有问题。所以304实际上不是一个错误?很可能不是,除非有一个奇怪的缓存问题。不过,我对index.html的看法可能是错误的;这可能无关紧要,但304就是关于socket.iojs的。不管怎样,一件容易测试的事情是,如果你清除缓存,看看会发生什么;结果是200吗?@Jerielle-这回答了你的问题并解释了304是如何工作的吗?
If-None-Match: xxxxx