node强缓存和协商缓存实战示例

我来为您讲解 “Node强缓存和协商缓存实战示例”的攻略。

强缓存

强缓存是指在缓存数据时,客户端直接使用缓存,而不再发起请求。要使用强缓存,需要设置响应头中的 Cache-ControlExpires

Cache-Control

通过设置 Cache-Controlmax-ages-maxage 可以实现强缓存。其中,max-age 是基于客户端本地时间的缓存时间,单位是秒,而 s-maxage 则是为代理缓存设置的缓存时间。例如:

Cache-Control: max-age=3600

这样,当第一次请求服务器时,服务器返回了数据,并在响应头中设置了 Cache-Control: max-age=3600 ,那么在一小时内,客户端直接使用本地缓存,并不再次请求服务器。

Expires

Expires 是设置过期缓存的时间,单位为 GMT 格式的时间字符串。例如:

Expires: Thu, 29 Apr 2021 08:22:23 GMT

Cache-Control 的区别在于,Expires 是基于服务器时间的,而 Cache-Control 是基于客户端本地时间的。

协商缓存

如果强制缓存无法满足要求,而需要每次发送请求时都与服务器进行一次交互,就可以使用协商缓存。协商缓存需要客户端将缓存标识发送给服务器,由服务器根据缓存标识进行判断是否命中缓存。

Last-Modified 和 If-Modified-Since

在请求头中加入 If-Modified-Since 字段,值为上一次的 Last-Modified 时,如果文件的修改时间跟 If-Modified-Since 中的时间一致,则返回 304 状态码,表示缓存未失效。例如:

If-Modified-Since: Thu, 29 Apr 2021 08:22:23 GMT

服务端需要在返回数据的同时,设置 Last-Modified 字段,值为该内容的最后修改时间。例如:

Last-Modified: Thu, 29 Apr 2021 08:22:23 GMT

ETag 和 If-None-Match

在服务端返回的响应头种加入 ETag 字段,用于标识版本号。客户端再次请求时,在请求头中带上上次的 ETag 值,服务端比对,如果一致,则返回 304 状态码。例如:

ETag: "12345"

客户端请求头中的 If-None-Match 字段可设置上次请求返回的 ETag 值。例如:

If-None-Match: "12345"

实例说明

以下是两个实战示例:

示例一:使用强缓存

const http = require('http');
const fs = require('fs');
const path = require('path');

http.createServer(function (req, res) {
  const filePath = path.join(__dirname, 'index.html');
  const stat = fs.statSync(filePath);
  const fileContent = fs.readFileSync(filePath);

  const lastModified = stat.mtime.toUTCString();

  res.setHeader('Cache-Control', 'max-age=3600');
  res.setHeader('Last-Modified', lastModified);

  const ifModifiedSince = req.headers['if-modified-since'];

  if (ifModifiedSince && ifModifiedSince === lastModified) {
    res.writeHead(304, 'Not Modified');
    res.end();
  } else {
    res.setHeader('Content-Length', Buffer.byteLength(fileContent));
    res.writeHead(200, 'OK');
    res.end(fileContent);
  }
}).listen(3000);

console.log('Http Server is running on port 3000.');

这里使用了强缓存,设置了 Cache-Control 的值,当文件未修改时,直接返回 304 状态码。如果文件重写,则会请求最新的文件。

示例二:使用协商缓存

const http = require('http');
const fs = require('fs');
const path = require('path');

http.createServer(function (req, res) {
  const filePath = path.join(__dirname, 'index.html');
  const stat = fs.statSync(filePath);
  const fileContent = fs.readFileSync(filePath);

  const lastModified = stat.mtime.toUTCString();
  const etag = `"${stat.size}-${stat.mtime.getTime()}"`;

  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Last-Modified', lastModified);
  res.setHeader('ETag', etag);

  const ifModifiedSince = req.headers['if-modified-since'];
  const ifNoneMatch = req.headers['if-none-match'];

  if (ifNoneMatch === etag) {
    res.writeHead(304, 'Not Modified');
    res.end();
  } else {
    res.setHeader('Content-Length', Buffer.byteLength(fileContent));
    res.writeHead(200, 'OK');
    res.end(fileContent);
  }
}).listen(3000);

console.log('Http Server is running on port 3000.');

这里使用了协商缓存,设置了 Last-ModifiedETag,当文件未修改时,直接返回 304 状态码,如果文件重写,则会请求最新的文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node强缓存和协商缓存实战示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs个人博客开发第六步 数据分页

    下面我会详细讲解“nodejs个人博客开发第六步 数据分页”的完整攻略。 步骤一:安装必要的依赖 在开始数据分页之前,我们需要安装一些必要的依赖,包括「mongoose-paginate」和「mongoose」。 npm install mongoose-paginate mongoose –save 步骤二:设置数据模型 在我们开始分页之前,我们需要先定…

    node js 2023年6月8日
    00
  • NodeJS仿WebApi路由示例

    首先解释一下什么是NodeJS仿WebApi路由。 NodeJS仿WebApi路由 在传统的Web开发中,服务器需根据前端请求的URL路径来执行对应的处理逻辑,比如: https://www.example.com/user/login/ 这个请求会被服务器转发到对应的登录处理逻辑。 而在NodeJS中,可以通过自定义路由,来实现这种URL路径转发。 实现步…

    node js 2023年6月8日
    00
  • 详解node.js 下载图片的 2 种方式

    当我们需要从网络上下载图片时,有两种方式可以选择。第一种是使用http模块来下载,而第二种则是使用第三方库request。以下是对这两种方式的详解: 方式一:使用http模块下载图片 要使用http模块下载图片,首先需要使用Node.js内置的模块http创建一个http请求,然后将其发送到要下载图片的URL地址上,并将请求到的数据保存下来。下面是一段例子代…

    node js 2023年6月8日
    00
  • Node.js Koa2使用JWT进行鉴权的方法示例

    以下是详细讲解“Node.js Koa2使用JWT进行鉴权的方法示例”的完整攻略。 什么是JWT JSON Web Token (JWT) 是一个标准,用于在不同的系统之间传输信息作为 JSON 对象。JWT 可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对来进行签名。JWT 可以包含用户的身份信息,以及应用程序需要的任何其…

    node js 2023年6月8日
    00
  • 关于node使用multer进行文件的上传与下载

    关于node使用multer进行文件的上传与下载的完整攻略,可以分为以下几个步骤: 安装multer 使用npm进行安装,并将multer添加到项目的package.json中 npm install –save multer 文件上传 使用multer读取上传的文件,并使用destination参数将文件存储到指定目录中。 const multer = …

    node js 2023年6月8日
    00
  • IntellJ idea使用FileWatch实时编译less文件的方法

    IntelliJ IDEA 是开发人员常用的一款IDE。我们可以通过使用FileWath实时编译LESS文件,来加速我们的开发工作。下面是使用FileWatch实时编译LESS文件的步骤方法: 步骤1:创建一个LESS文件 首先,我们需要创建一个新的LESS文件。可以通过右键点击项目根目录,选择New -> File ->LESS File,然后…

    node js 2023年6月8日
    00
  • 如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)

    下面是完整攻略。 什么是H5 History模式? H5 History模式是HTML5中新增的History API。它通过更改浏览器地址栏的URL来实现页面不刷新的页面跳转效果。在使用H5 History API时,需要在Nodejs中配置路由规则来支持。一般来说,当你在单页应用中进行跳转时,H5 History模式都是被默认启用的。 解决方案 若要让N…

    node js 2023年6月8日
    00
  • Node.js搭建WEB服务器的示例代码

    我会逐步为您讲解如何使用Node.js搭建WEB服务器,并提供两个示例说明。 什么是Node.js Node.js是基于Chrome V8 JavaScript引擎的开源的、跨平台的、事件驱动的JavaScript运行时环境。它使得开发者可以使用JavaScript编写后端服务器、命令行工具等应用程序。也就是说,使用Node.js可以将 JavaScript…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部