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

yizhihongxing

我来为您讲解 “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日

相关文章

  • 一文带你了解前端包管理工具npm、yarn和pnpm

    一文带你了解前端包管理工具npm、yarn和pnpm 前言 前端包管理工具是前端开发中必不可少的工具之一,它可以帮助我们快速便捷地安装、升级、管理前端项目中的各种依赖包。本文主要介绍三种最常用的前端包管理工具npm、yarn和pnpm。 npm npm全称为Node Package Manager,是由Node.js官方提供的包管理工具。npm的特点为: 可…

    node js 2023年6月8日
    00
  • 如何用node优雅地打印全链路日志

    下面是详细的攻略。 1. 需求分析 在开发过程中,我们需要记录应用程序的全链路日志以便于排查问题和进行性能优化。要实现全链路日志,需要收集每个请求的相关信息,如请求方法、请求参数、响应状态码、响应时间、错误类型等信息。这些信息需要保留到一个日志文件中。 2. 策略设计 要优雅地打印全链路日志,我们需要使用以下策略: 定义一个格式化文本日志中间件,将收集的日志…

    node js 2023年6月8日
    00
  • 使用node.js 获取客户端信息代码分享

    下面是使用node.js获取客户端信息的攻略。 获取客户端信息 什么是客户端信息? 在网络通信中,客户端是指使用网络服务的用户终端(如电脑、手机、平板等),客户端信息是指提供如客户端类型、操作系统、浏览器等与客户端相关的信息。 如何获取客户端信息? 在Node.js中,可以通过request对象来获取HTTP请求的相关信息,其中包括客户端信息。request…

    node js 2023年6月8日
    00
  • Node.js HTTP服务器中的文件、图片上传的方法

    Node.js提供了http模块作为内置的HTTP服务器,在其中可以实现文件上传和图片上传的功能。以下是完整攻略: 文件上传 前置条件 在实现文件上传之前,需要安装formidable模块。可以通过运行以下命令安装: npm install formidable 代码示例 const http = require(‘http’); const fs = re…

    node js 2023年6月8日
    00
  • 详解Express笔记之动态渲染HTML(新手入坑)

    下面我将详细讲解“详解Express笔记之动态渲染HTML(新手入坑)”完整攻略,具体内容如下: 什么是动态渲染HTML 动态渲染HTML是指在服务器端生成HTML代码,并将其发送到客户端显示,与静态HTML文件不同,静态HTML文件是在客户端本地存储的HTML文件,而动态渲染HTML是根据客户端请求的不同数据动态生成不同的HTML网页。动态渲染HTML主要…

    node js 2023年6月8日
    00
  • express.js如何做mysql注入与node-mysql中防止SQL注入方法解析

    express.js是一个基于Node.js平台的Web应用程序框架,而MySQL是一种广泛使用的开源关系型数据库管理系统。在使用express.js的过程中,我们很可能要用到MySQL数据库,因此必须注意MySQL注入这个安全问题。 一、什么是MySQL注入? MySQL注入是指通过对Web表单和参数提交进行恶意操作,来攻击Web应用程序中的MySQL数据…

    node js 2023年6月8日
    00
  • Node.js使用express写接口的具体代码

    下面是关于使用Node.js和express框架编写接口的具体攻略。我们将通过两条示例来演示如何以正确的方式编写和使用这些代码。 准备工作 在开始编写代码之前,您需要确保您已经完成了以下准备工作: 已经安装了Node.js及其包管理器npm 通过npm安装了express框架 您可以通过以下命令来检查是否已安装Node.js和npm: $ node -v $…

    node js 2023年6月8日
    00
  • KnockoutJS 3.X API 第四章之数据控制流foreach绑定

    KnockoutJS是一个JavaScript库,可以轻松地将数据绑定到HTML页面中。KnockoutJS的核心功能是数据绑定,而其中一个重要的数据绑定功能是“foreach”绑定。本文主要详细讲解KnockoutJS 3.X API 第四章之数据控制流foreach绑定的使用方法。 1. foreach绑定概述 “foreach”绑定可用于循环渲染一组数…

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