Next.js 中的中间件

Next.js 中的中间件

Next.js 中的中间件是一个功能强大的工具,允许开发人员拦截、修改和控制应用程序中的请求和响应流。无论我们是构建服务器渲染的网站还是成熟的 Web 应用程序,了解如何有效使用中间件都可以显着增强项目进出的数据流。本文将从基础知识到高级技术探索 Next.js 中的中间件。

什么是中间件?

在构建网络站点或应用程序时,中间件是一个值得理解的重要概念。简单来说中间件是一种提供了拦截和操纵请求 -> 响应周期各个方面的机制。该机制根据应用程序的需求操作传入的请求或传出响应。

Next.js 的中间件允许用户在粒度级别上塑造和控制其 Web 应用程序的行为,而无需额外的步骤,仅此而已。

中间件的工作是在 HTTP 请求和响应通过应用程序时拦截和操作它们。

现在我们了解了基本概念,让我们看一下下面的几个中间件用例。

路由:

路由控制允许将请求重定向到不同的 URL,处理或强制执行 URL 模式。这在管理应用程序中的复杂路由场景时特别有用。

function redirectMiddleware(request) {// 重定向window.location.href = '/new-url';return {status: 204,body: '',};
}

Cookie 管理:

中间件可以管理传入请求和传出响应中的 cookie。这对于设置用户会话 cookie、读取 cookie 进行身份验证或在用户注销时删除 cookie 等任务至关重要。

function cookieManagementMiddleware(request) {const response = {status: 200,cookies: {myCookie: '123',},};return response;
}

鉴权:

中间件可以在授予对特定路由或资源的访问权限之前检查用户是否经过身份验证。

在下面的示例中,当用户尝试访问受保护的路由时,中间件功能通过会话 cookie 检查身份验证来验证其身份。如果用户未通过身份验证,他们将被重定向到登录页面或被拒绝访问。

function authenticationMiddleware(request) {if (!(request.headers.cookie && request.headers.cookie.includes('authenticated=true'))) {// 重定向回登录路由window.location.href = '/login';return {status: 204, // No contentbody: '',};}return {status: 200,};
}

日志

详细记录传入请求,包括请求方法、URL、标头和时间戳信息。这些日志对于诊断问题、跟踪用户活动和分析性能非常宝贵。

function loggingMiddleware(request) {console.log(`Received ${request.method} request to ${request.url} at ${new Date()}`);return {status: 200,};
}

响应定制:

根据特定条件自定义响应头、状态码或响应内容。例如,我们可以设置自定义标头以向客户端提供附加信息或动态调整响应内容。

function customHeadersMiddleware(request) {const response = {status: 200,headers: {'X-Custom-Header': 'Hello, Middleware!',},cookies: {myCookie: '123',},};return response;
}

现在我们了解了中间件是什么以及它为何有用,让我们开始在 Next.js 中使用它。

Next.js 中的中间件

中间件文件

在 Next.js 中,中间件是在项目根目录中通常名为 middleware.ts(或 js) 文件中定义的我们将在该文件中定义中间件函数。这是一个基本的示例函数:

// middleware.ts 
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function myMiddleware(request: NextRequest) {// 中间逻辑// ...return NextResponse.next(); // 执行下一个中间件
}

NextResponse

NextResponse 是 Next.js 中的一个 API,允许我们在中间件中处理响应。它提供了重定向请求、重写响应、设置标头、cookie 等方法。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function myMiddleware(request: NextRequest) {// 将请求重定向到不同的 URLreturn NextResponse.redirect('/new-url');// 重写响应以显示来自不同 URL 的内容return NextResponse.rewrite('/new-content');// 设置响应头和cookieconst response = NextResponse.next();response.headers.set('X-Custom-Header', 'Hello, Middleware!');response.cookies.set('myCookie', '123');return response;
}

在 Next.js 中使用中间件

Next.js 中的中间件函数可以访问传入请求和响应。我们可以修改这些对象来定制应用程序的行为。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function authenticationMiddleware(request: NextRequest) {// 检查用户是否已通过身份验证if (!request.headers.cookie?.includes('authenticated=true')) {return NextResponse.redirect('/login');}return NextResponse.next(); // 继续下一个中间件或路由处理程序
}

设置 headers 和 Cookie

中间件可以操作传入请求和传出响应中的 headers 和 cookie。这对于自定义响应或管理用户会话等任务非常有用。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function customHeadersMiddleware(request: NextRequest) {const response = NextResponse.next();response.headers.set('X-Custom-Header', 'Hello, Middleware!');response.cookies.set('myCookie', '123');return response;
}

生成自定义响应

中间件可以通过返回 Response 或 NextResponse 实例直接生成响应。这允许我们根据自定义逻辑控制发送到客户端的响应。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function customResponseMiddleware(request: NextRequest) {if (/* Some condition */) {return new Response('Custom error message', { status: 400 });}return NextResponse.next();
}

现在我们已经介绍了基础知识,让我们探索一些在 Next.js 中使用中间件的高级技术。

先进的中间件技术

拦截API调用

中间件的一种强大用例是拦截 API 调用。我们可以使用中间件修改 API 请求标头、缓存响应,甚至模拟 API 调用以进行测试。

修改请求头

我们可以使用中间件修改传出 API 请求的标头。这样做通常是为了在发送请求之前将身份验证令牌、API 密钥或其他必要信息添加到标头中。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function apiInterceptorMiddleware(request: NextRequest) {// 修改请求头request.headers.set('Authorization', 'Bearer myAccessToken');// 可以实现一些api响应缓存逻辑return NextResponse.next();
}

缓存 API 响应

为了提高应用程序的性能,我们可以在中间件中实现 API 响应的缓存。这有助于减少外部 API 的负载并加快对相同数据的后续请求。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function apiInterceptorMiddleware(request: NextRequest) {// 判断是否存在缓存const cachedResponse = /* 实现缓存逻辑 */;if (cachedResponse) {// 返回缓存return cachedResponse;} else {// 请求const apiResponse = /* 请求逻辑 */;// 缓存响应return apiResponse;}
}

模拟 API 调用进行测试

中间件还可用于在测试期间模拟 API 调用。这可确保我们的测试不依赖于外部服务,从而使测试更加可靠、更快。

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';export function apiMockMiddleware(request: NextRequest) {if (process.env.NODE_ENV === 'test') {// 在测试环境中返回测试数据return new Response(JSON.stringify({ mockData: true }), {status: 200,headers: {'Content-Type': 'application/json',},});} else {// 在其他环境中继续执行return NextResponse.next();}
}

这些先进技术说明了中间件在处理 Next.js 应用程序中的 API 调用时的灵活性和强大功能。无论我们需要保护 API 请求、通过缓存优化性能,还是通过模拟响应简化测试,中间件都可以成为我们的首选解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Thymeleaf生成pdf表格合并单元格描边不显示

生成pdf后左侧第一列的右描边不显示,但是html显示正常 显示异常时描边的写法 cellpadding“0” cellspacing“0” ,td,th描边 .self-table{border:1px solid #000;border-collapse: collapse;width:100%}.self-table th{font-size:12px;border:1px sol…

el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求 Select 选择器 多选需要增加 全选 和 取消全选 功能&#xff0c;前端框架为vue2&#xff0c;UI组件为elementUI。 2. 代码 html部分 <template><el-tooltip effect"dark" :disabled"defaultValue.length < 0" :content"defaul…

GO设计模式——7、适配器模式(结构型)

目录 适配器模式&#xff08;Adapter Pattern&#xff09; 优缺点 使用场景 注意事项 代码实现 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。将一个类的接口转化为客户希望的…

dockerfile简单实践部署(jenkins,wordpress)

实现部署jenkins的流程 配置java环境&#xff0c;导入jenkins包&#xff0c;运行命令 java -jar jenkins包&#xff0c;这里为了减少进入jenkins的web端安装插件&#xff0c;将插件提前部署到容器内。 制作dockerfile 创建镜像所在的文件夹和Dockerfile文件 mkdir /test cd …

如何优雅使用 vue-html2pdf 插件生成pdf报表

使用 vue-html2pdf 插件 业务背景&#xff0c;老板想要一份能征服客户的pdf报表&#xff0c;传统的pdf要手撕&#xff0c;企业中确实有点耗费时间&#xff0c;于是github上面看到开源的这个插件就…废话不多说&#xff0c;直接上教程 1.使用下面命令安装 vue-html2pdf npm i…

Vue3项目调用腾讯地图服务(地址解析 地址转坐标)及使用axios的跨域问题

一,需求 根据传入的文本地址 将其转换为坐标 显示地图点位在腾讯地图上 二,使用axios发送请求 import axios from axios; //引入axiosaxios({url:https://apis.map.qq.com/ws/geocoder/v1,method:get//参数 地址和key值}).then((data)>{console.log(data)});但是使用完报跨…

第二十一章总结博客

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission …

阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜

今天&#xff0c;AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。随着容器技术和服务在企业的应用程度不断加深&#xff0c;企业对于容器的使用也越来越多地从在线业务逐渐向 AI、大数据类型的工作负载发展。同时&#xff0c;开发人员在考虑如何通过云原生…

MQTT源码分析

目录 MQTT源码分析 1. MQTT客户端功能 2. 客户端软件如何实现 3. 程序分层 4. 情景分析 4.1 连接服务器 4.2 创建线程 4.3 发布消息 4.4 最复杂&#xff1a;订阅消息 MQTT源码分析 分析源码&#xff1a;mqttclient\test\emqx\test.c 参考资料&#xff1a; kawaii-mqt…

IntelliJ IDEA 2023.3 最新变化

关键亮点 AI Assistant 预览阶段结束 全面推出 Ultimate JetBrains AI Assistant 现已全面推出&#xff0c;搭载大量新功能和改进&#xff0c;助力提高您在 JetBrains IDE 中的工作效率。 最新更新包括编辑器中增强的直接代码生成、无需复制代码即可回答项目相关查询的上下文…

Linux篇:进程间通信

一、进程间通信原理&#xff1a; 1、通信是有成本的&#xff1a;两个或者多个进程&#xff0c;实现数据层面的交互&#xff0c;因为进程独立性的存在&#xff0c;导致进程通信的成本比较高。 2、进程间通信的方式&#xff1a; ①基本数据 ②发送命令 ③某种协同 ④通知 .....…

Hibernate更新多实体对象的坑

目录 Hibernate中的脏检查机制 多线程环境下的问题 解决方案 1. 使用乐观锁 2. 使用悲观锁 3. 使用同步机制 总结与建议 在Hibernate中&#xff0c;当一个大对象&#xff08;通常是一个实体对象&#xff09;包含了几个小对象&#xff08;通常是关联的实体对象&#xff0…

【Python】np.maximum()和np.minimum()函数详解和示例

本文通过函数原理和运行示例&#xff0c;对np.maximum()和np.minimum()函数进行详解&#xff0c;以帮助大家理解和使用。 更多Numpy函数详解和示例&#xff0c;可参考 【Python】Numpy库近50个常用函数详解和示例&#xff0c;可作为工具手册使用 目录 np.maximum()函数解析运…

华为OD机试 - 攀登者2(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…

我有才打造知识付费小程序

一站式线上线下活动管理 为用户提供“精彩城市生活和人脉资源”。 在线活动提供创业、互联网、科技、投资、金融、教育、亲子、生活、聚会交友、医疗、设计、分享会、脱口秀、音乐演出等多种活动类型, 为职场白领提升技能、拓展人脉、聚会交友的首选平台。 为主办方提供“一…

Navicat 连接 GaussDB分布式的快速入门

Navicat Premium&#xff08;16.3.3 Windows版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构…

警惕自研产品商业化的潜在失败风险

前言&#xff1a;为什么选择计算机呢&#xff1f;因为我对创造产品感兴趣&#xff0c;想通过代码实现有价值的产品。后来发现代码可以让同学&#xff08;程序员&#xff09;来实现&#xff0c;自己专注于产品设计这块即可。在市场中&#xff0c;上线的产品想变现就需要商业化&a…

【Linux】已安装 powerlevel10k,报错 command not found: p10k

问题描述 在配置 zsh 时&#xff0c;已经安装了 powerlevel10k&#xff0c;但是当尝试启动 Powerlevel10k 配置向导时&#xff0c;出现了以下错误&#xff1a; p10k configure zsh: command not found: p10k原因分析 出现这个错误的原因是因为 zsh 终端还没有加载最新的配置…

【Element】el-table组件使用summary-method属性设置表格底部固定两行并动态赋值

一、背景 需求&#xff1a;在表格账单中底部添加两行固定行&#xff0c;来统计当前页小计和总计。element ui 官网上是直接将本列所有数值进行求合操作的&#xff0c;且只有固定一行总计。目前的需求是将接口返回的数据填充到底部固定的两行中 二、底部添加两行固定行 2.1、…

一天一个设计模式---原型模式

基本概念 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式允许在运行时动态创建对象&#xff0c;同时避免了耦合与子类化。 在原型模式中&#xff0…