<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[fresh模块 - Node.js开发参考——模具行业从业者必备知识手册]]></title><description><![CDATA[<p dir="auto">&lt;h2&gt;fresh&lt;/h2&gt;</p>
<p dir="auto">&lt;p&gt;[![NPM Version][npm-image&rsqb;&rsqb;[npm-url]&lt;/p&gt;<br />
&lt;p&gt;[![NPM Downloads][downloads-image&rsqb;&rsqb;[downloads-url]&lt;/p&gt;<br />
&lt;p&gt;[![Node.js Version][node-version-image&rsqb;&rsqb;[node-version-url]&lt;/p&gt;<br />
&lt;p&gt;[![Build Status][travis-image&rsqb;&rsqb;[travis-url]&lt;/p&gt;<br />
&lt;p&gt;[![Test Coverage][coveralls-image&rsqb;&rsqb;[coveralls-url]&lt;/p&gt;</p>
<p dir="auto">&lt;p&gt;HTTP response freshness testing&lt;/p&gt;</p>
<p dir="auto">&lt;h3&gt;Installation&lt;/h3&gt;</p>
<p dir="auto">&lt;p&gt;This is a &lt;a href="<a href="https://nodejs.org/en/" rel="nofollow ugc">https://nodejs.org/en/</a>"&gt;Node.js&lt;/a&gt; module available through the&lt;/p&gt;<br />
&lt;p&gt;&lt;a href="<a href="https://www.npmjs.com/" rel="nofollow ugc">https://www.npmjs.com/</a>"&gt;npm registry&lt;/a&gt;. Installation is done using the&lt;/p&gt;<br />
&lt;p&gt;&lt;a href="<a href="https://docs.npmjs.com/getting-started/installing-npm-packages-locally" rel="nofollow ugc">https://docs.npmjs.com/getting-started/installing-npm-packages-locally</a>"&gt;&lt;code&gt;npm install&lt;/code&gt; command&lt;/a&gt;:&lt;/p&gt;</p>
<p dir="auto">&lt;pre&gt;&lt;code&gt;<br />
$ npm install fresh<br />
&lt;/code&gt;&lt;/pre&gt;</p>
<p dir="auto">&lt;h3&gt;API&lt;/h3&gt;</p>
<p dir="auto">&lt;p&gt;&lt;!-- eslint-disable no-unused-vars --&gt;&lt;/p&gt;</p>
<p dir="auto">&lt;pre&gt;&lt;code&gt;<br />
var fresh = require('fresh')<br />
&lt;/code&gt;&lt;/pre&gt;</p>
<p dir="auto">&lt;h4&gt;fresh(reqHeaders, resHeaders)&lt;/h4&gt;</p>
<p dir="auto">&lt;p&gt;Check freshness of the response using request and response headers.&lt;/p&gt;</p>
<p dir="auto">&lt;p&gt;When the response is still "fresh" in the client's cache &lt;code&gt;true&lt;/code&gt; is&lt;/p&gt;<br />
&lt;p&gt;returned, otherwise &lt;code&gt;false&lt;/code&gt; is returned to indicate that the client&lt;/p&gt;<br />
&lt;p&gt;cache is now stale and the full response should be sent.&lt;/p&gt;</p>
<p dir="auto">&lt;p&gt;When a client sends the &lt;code&gt;Cache-Control: no-cache&lt;/code&gt; request header to&lt;/p&gt;<br />
&lt;p&gt;indicate an end-to-end reload request, this module will return &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;<br />
&lt;p&gt;to make handling these requests transparent.&lt;/p&gt;</p>
<p dir="auto">&lt;h3&gt;Known Issues&lt;/h3&gt;</p>
<p dir="auto">&lt;p&gt;This module is designed to only follow the HTTP specifications, not&lt;/p&gt;<br />
&lt;p&gt;to work-around all kinda of client bugs (especially since this module&lt;/p&gt;<br />
&lt;p&gt;typically does not recieve enough information to understand what the&lt;/p&gt;<br />
&lt;p&gt;client actually is).&lt;/p&gt;</p>
<p dir="auto">&lt;p&gt;There is a known issue that in certain versions of Safari, Safari&lt;/p&gt;<br />
&lt;p&gt;will incorrectly make a request that allows this module to validate&lt;/p&gt;<br />
&lt;p&gt;freshness of the resource even when Safari does not have a&lt;/p&gt;<br />
&lt;p&gt;representation of the resource in the cache. The module&lt;/p&gt;<br />
&lt;p&gt;&lt;a href="<a href="https://www.npmjs.com/package/jumanji" rel="nofollow ugc">https://www.npmjs.com/package/jumanji</a>"&gt;jumanji&lt;/a&gt; can be used in&lt;/p&gt;<br />
&lt;p&gt;an Express application to work-around this issue and also provides&lt;/p&gt;<br />
&lt;p&gt;links to further reading on this Safari bug.&lt;/p&gt;</p>
<p dir="auto">&lt;h3&gt;Example&lt;/h3&gt;</p>
<p dir="auto">&lt;h4&gt;API usage&lt;/h4&gt;</p>
<p dir="auto">&lt;p&gt;&lt;!-- eslint-disable no-redeclare, no-undef --&gt;&lt;/p&gt;</p>
<p dir="auto">&lt;pre&gt;&lt;code&gt;<br />
var reqHeaders = { 'if-none-match': '"foo"' }<br />
var resHeaders = { 'etag': '"bar"' }<br />
fresh(reqHeaders, resHeaders)<br />
// =&gt; false</p>
<p dir="auto">var reqHeaders = { 'if-none-match': '"foo"' }<br />
var resHeaders = { 'etag': '"foo"' }<br />
fresh(reqHeaders, resHeaders)<br />
// =&gt; true<br />
&lt;/code&gt;&lt;/pre&gt;</p>
<p dir="auto">&lt;h4&gt;Using with Node.js http server&lt;/h4&gt;</p>
<p dir="auto">&lt;pre&gt;&lt;code&gt;<br />
var fresh = require('fresh')<br />
var http = require('http')</p>
<p dir="auto">var server = http.createServer(function (req, res) {<br />
// perform server logic<br />
// ... including adding ETag / Last-Modified response headers</p>
<p dir="auto">if (isFresh(req, res)) {<br />
// client has a fresh copy of resource<br />
res.statusCode = 304<br />
res.end()<br />
return<br />
}</p>
<p dir="auto">// send the resource<br />
res.statusCode = 200<br />
res.end('hello, world!')<br />
})</p>
<p dir="auto">function isFresh (req, res) {<br />
return fresh(req.headers, {<br />
'etag': res.getHeader('ETag'),<br />
'last-modified': res.getHeader('Last-Modified')<br />
})<br />
}</p>
<p dir="auto">server.listen(3000)<br />
&lt;/code&gt;&lt;/pre&gt;</p>
<p dir="auto">&lt;h3&gt;License&lt;/h3&gt;</p>
<p dir="auto">&lt;p&gt;&lt;a href="LICENSE"&gt;MIT&lt;/a&gt;&lt;/p&gt;</p>
<p dir="auto">&lt;p&gt;[npm-image]: <a href="https://img.shields.io/npm/v/fresh.svg" rel="nofollow ugc">https://img.shields.io/npm/v/fresh.svg</a>&lt;/p&gt;<br />
&lt;p&gt;[npm-url]: <a href="https://npmjs.org/package/fresh" rel="nofollow ugc">https://npmjs.org/package/fresh</a>&lt;/p&gt;<br />
&lt;p&gt;[node-version-image]: <a href="https://img.shields.io/node/v/fresh.svg" rel="nofollow ugc">https://img.shields.io/node/v/fresh.svg</a>&lt;/p&gt;<br />
&lt;p&gt;[node-version-url]: <a href="https://nodejs.org/en/" rel="nofollow ugc">https://nodejs.org/en/</a>&lt;/p&gt;<br />
&lt;p&gt;[travis-image]: <a href="https://img.shields.io/travis/jshttp/fresh/master.svg" rel="nofollow ugc">https://img.shields.io/travis/jshttp/fresh/master.svg</a>&lt;/p&gt;<br />
&lt;p&gt;[travis-url]: <a href="https://travis-ci.org/jshttp/fresh" rel="nofollow ugc">https://travis-ci.org/jshttp/fresh</a>&lt;/p&gt;<br />
&lt;p&gt;[coveralls-image]: <a href="https://img.shields.io/coveralls/jshttp/fresh/master.svg" rel="nofollow ugc">https://img.shields.io/coveralls/jshttp/fresh/master.svg</a>&lt;/p&gt;<br />
&lt;p&gt;[coveralls-url]: <a href="https://coveralls.io/r/jshttp/fresh?branch=master" rel="nofollow ugc">https://coveralls.io/r/jshttp/fresh?branch=master</a>&lt;/p&gt;<br />
&lt;p&gt;[downloads-image]: <a href="https://img.shields.io/npm/dm/fresh.svg" rel="nofollow ugc">https://img.shields.io/npm/dm/fresh.svg</a>&lt;/p&gt;<br />
&lt;p&gt;[downloads-url]: <a href="https://npmjs.org/package/fresh" rel="nofollow ugc">https://npmjs.org/package/fresh</a>&lt;/p&gt;</p>
<p dir="auto">&lt;hr&gt;</p>
<p dir="auto">&lt;p&gt;本文由模极社发布&lt;/p&gt;</p>
<p dir="auto">&lt;hr&gt;<br />
&lt;h4&gt;<img src="https://forum.mj7.cn/assets/plugins/nodebb-plugin-emoji/emoji/android/1f517.png?v=k0o2a4s5i30" class="not-responsive emoji emoji-android emoji--link" title=":link:" alt="🔗" /> 你可能还感兴趣&lt;/h4&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href="/t/4192/4192"&gt;2026年4月工作计划&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="/t/3674/3674"&gt;PPO（聚苯醚）&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="/t/2840/2840"&gt;动模座板功能说明与设计选型指南&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;</p>
<p dir="auto">&lt;hr&gt;<br />
&lt;p&gt;你在实际生产中遇到过类似问题吗？欢迎留言讨论。&lt;/p&gt;</p>
]]></description><link>https://forum.mj7.cn/topic/7206/fresh模块-node-js开发参考-模具行业从业者必备知识手册</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 09:35:04 GMT</lastBuildDate><atom:link href="https://forum.mj7.cn/topic/7206.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Apr 2026 21:56:21 GMT</pubDate><ttl>60</ttl></channel></rss>