【前端】在Next.js中cors 库的使用及限制跨域请求的速度

cors 库是一个用于方便地启用跨域资源共享(CORS)的 Node.js 中间件。在 Next.js 中,你可以利用这个库来处理来自不同源的请求。下面是详细的步骤说明,展示如何在 Next.js 中使用 cors 库。

安装 cors

首先,你需要安装 cors 包。可以通过 npm 或 yarn 安装:

npm install cors

或者

yarn add cors

配置 cors

接下来,你需要配置 cors 中间件来处理来自不同源的请求。在 Next.js 中,你可以将 cors 作为中间件添加到你的 API 路由中。

示例:创建 API 路由并使用 cors
  1. 创建 API 路由

    pages/api 目录下创建一个新的文件,如 exampleApi.js,用于处理来自前端的请求:

    import cors from 'cors';
    import initMiddleware from '../../lib/initMiddleware';// 初始化 cors 中间件
    const corsMiddleware = initMiddleware(cors({origin: (origin, callback) => {// 根据需要更改 origin 参数,以允许指定的域名或使用通配符允许所有域名callback(null, true);},credentials: true, // 是否允许 cookie 和 header 中的凭据optionsSuccessStatus: 200, // 有些浏览器(如 IE)要求 CORS 请求的成功状态码为 200})
    );export default async function handler(req, res) {// 应用 cors 中间件await corsMiddleware(req, res);// 你的 API 逻辑res.status(200).json({ message: 'Hello from your API.' });
    }
    
  2. 初始化中间件

    lib 目录下创建一个名为 initMiddleware.js 的文件,用于初始化中间件:

    // lib/initMiddleware.js
    const initMiddleware = middleware =>async (req, res) => {return new Promise((resolve, reject) => {middleware(req, res, (result) => {if (result instanceof Error) {return reject(result);}return resolve(result);});});};export default initMiddleware;
    

使用 cors 中间件

现在你已经配置好了 cors 中间件,可以在 API 路由中使用它来处理来自不同源的请求。当前端应用程序向这个 API 路由发出请求时,cors 中间件将会自动处理跨域请求,并设置适当的响应头。

前端请求示例

假设你在前端应用程序中有一个按钮,点击后会向 /api/exampleApi 发起请求:

async function fetchData() {const response = await fetch('/api/exampleApi', {method: 'GET',headers: {'Content-Type': 'application/json',// 如果需要携带 cookie 或其他认证信息,请设置 'credentials' 为 'include''credentials': 'include'}});const data = await response.json();console.log(data);
}document.getElementById('fetchButton').addEventListener('click', fetchData);

配置 cors 选项

cors 库提供了多种选项来定制跨域行为。以下是一些常用的选项:

  • origin: 一个回调函数,用于验证请求是否来自允许的源。
  • methods: 允许的方法列表,默认为 'GET,HEAD,PUT,PATCH,POST,DELETE'
  • preflightContinue: 默认为 false,表示预检请求将立即响应,而不是继续到后续的中间件。
  • optionsSuccessStatus: 预检请求的成功状态码,默认为 200
  • maxAge: 预检请求的有效期(秒),默认为 86400
  • credentials: 是否允许 cookie 和 header 中的凭据,默认为 false
  • exposedHeaders: 响应中可以被访问的头部字段列表。
  • allowedHeaders: 允许的头部字段列表。

跨域限速

要使用 cors 库来限制跨域请求的速度,实际上 cors 库本身并不直接支持速率限制的功能。然而,你可以结合使用其他的中间件或库来实现速率限制。以下是如何结合使用 cors 和速率限制中间件来达到目的的一种方法。

步骤 1: 安装必要的库

首先,你需要安装 cors 和一个速率限制中间件,例如 express-rate-limit。这是因为 Next.js 的 API 路由本质上是基于 Express 的,所以我们可以使用 Express 的中间件。

npm install cors express-rate-limit
步骤 2: 创建速率限制中间件

接下来,我们将创建一个速率限制中间件,该中间件将应用于所有或特定的 API 路由。

示例:创建速率限制中间件
  1. 创建速率限制中间件

    在项目的 lib 目录下创建一个名为 rateLimitMiddleware.js 的文件,用于定义速率限制逻辑:

    // lib/rateLimitMiddleware.js
    import rateLimit from 'express-rate-limit';// 创建一个速率限制器实例
    const limiter = rateLimit({windowMs: 1 * 60 * 1000, // 时间窗口,例如 1 分钟max: 10, // 在时间窗口内允许的最大请求次数message: 'Too many requests from this IP, please try again in an hour.',
    });export default limiter;
    
步骤 3: 配置 API 路由

接着,在你的 API 路由中同时使用 cors 和速率限制中间件。

示例:配置 API 路由
  1. 创建 API 路由

    pages/api 目录下创建一个新的文件,如 exampleApi.js,用于处理来自前端的请求:

    import cors from 'cors';
    import initMiddleware from '../../lib/initMiddleware';
    import rateLimitMiddleware from '../../lib/rateLimitMiddleware';// 初始化 cors 中间件
    const corsMiddleware = initMiddleware(cors({origin: (origin, callback) => {// 根据需要更改 origin 参数,以允许指定的域名或使用通配符允许所有域名callback(null, true);},credentials: true, // 是否允许 cookie 和 header 中的凭据optionsSuccessStatus: 200, // 有些浏览器(如 IE)要求 CORS 请求的成功状态码为 200})
    );export default async function handler(req, res) {// 应用速率限制中间件await rateLimitMiddleware(req, res, async () => {// 应用 cors 中间件await corsMiddleware(req, res);// 你的 API 逻辑res.status(200).json({ message: 'Hello from your API.' });});
    }
    
步骤 4: 测试

现在你可以测试 API 路由,看看是否实现了跨域请求的速率限制。

总结

通过上述步骤,你可以在 Next.js 中使用 corsexpress-rate-limit 库来限制跨域请求的速度。这种组合方式可以让你在处理跨域请求的同时,防止恶意用户频繁请求导致的服务滥用。

需要注意的是,express-rate-limit 是一个通用的中间件,并不限于处理 CORS 请求。这意味着它可以应用于任何需要速率限制的场景。

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

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

相关文章

躺平成长-下一个更新的数据(躺平成长数据显示核心)

旭日图(Sunburst Chart)是一种用于展示具有层次结构数据的可视化图表。 它起源于饼图和环形图,并随着数据可视化需求的发展而演变。 旭日图通过将层次结构数据以由内向外的同心圆环形式展示,使数据的层次关系更加清晰直观。 以下…

【C++、数据结构】哈希表——散列表(一)(概念/总结)

「前言」 🌈个人主页: 代码探秘者 🌈C语言专栏:C语言 🌈C专栏: C / STL使用以及模拟实现 🌈数据结构专栏: 数据结构 / 十大排序算法 🌈Linux专栏: Linux系统编…

OpenCV图像预处理1

目录 图像翻转 图像仿射变换 仿射变换函数 图像旋转 图像平移 图像缩放 图像倾斜 图像色彩空间转换 RGB 转 Gray RGB 转 HSV 图像二值化处理 图像掩模 图像位与操作 图像检测轮廓 绘制轮廓 图像翻转 cv2.flip(src, flipCode[, dst]) -> dst 用于翻转图像。翻…

金融量化交易模型的探索与发展

在当代金融市场中,量化交易模型的应用不断提升,逐渐成为大数据与人工智能等前沿技术的集大成者。量化交易借助数学模型和算法分析市场信息,自动执行交易决策,具备精确、效率高等特点,且能够在复杂多变的市场中有效应对…

求逻辑地址的页号和物理地址

逻辑地址空间按字编址 -->逻辑地址长度为:log2(逻辑地址空间) 页的大小 --> 页内偏移量占log(页的大小) 逻辑页号页内偏移量逻辑地址长度 因此假如一个逻辑地址空间为64kb,页的大小为1kb,逻辑地址为17CAH,求逻辑地址页号…

ETLCloud怎么样?深度解析其在数据管理中的表现

在BI或数据大屏等数据分析工具中,经常需要从多个业务系统中提取原始数据,然后对数据进行清洗、处理,以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用,从高质量的实现企业数据的价值变现。 然而,在…

Windows SEH异常处理讨论

Windows C程序异常的类型 在Windows C异常的场景中,我们需要理解以下两种类型的异常: C语言抛出的异常。 这是利用C throw抛出的exception,利用C try-catch即可捕获。即便是来自于另一个DLL的C exception,仍然能利用C try-catch…

Windows 基础(一):深入理解Windows,掌握命令行与Shell

内容预览 ≧∀≦ゞ Windows 基础(一)声明导语一、Windows 和 Linux 的区别二、Windows 的ShellShell 和 终端 的区别1. 命令提示符(CMD)2. Windows PowerShell3. Windows Terminal4. Windows Subsystem for Linux (WSL) 三、Windo…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据查询(超详细)

目录 一、单表查询 1. 简单的数据查询 (1)选择表中若干列 (2)选择表中若干行(元祖) 2. 聚合函数与分组查询 聚集函数 GROUP BY分组查询 二、联接查询 1、连接概述 2. 内联接(INNER JO…

unity后端kbengine用DOTween让 移动同步丝滑

unity在网络同步kbengine框架,同步移动时, 看自己很丝滑,但看他人是在跳越移动,一闪一闪,像掉帧, 看什么插值,高频同步,都不实用 用DOTween的 transform.DOMove(目标位置, 时间); //顺滑移动动画 这段代码不是放在Avatar.cs,放在AvatarView.cs里 if (Avatar.isPlayer() false…

【Effective C++】阅读笔记3

1. 成员变量声明为Private 建议将成员变量声明为Private,然后再public中提供调用该数据的接口 设置成Private的原因分析 类内成员变量被声明为Private,那么就可以外部代码直接访问或者修改内部数据通过公共接口获取内部数据,这样可以减少对外…

CSS3新增背景属性(四)

CSS3新增背景属性 1 background-origin 设置背景图原点起始位置: padding-box:默认值从padding区域开始显示背景图像;border-box:从border区域开始显示背景图像;content-box:从content区域开始显示背景图像…

C语言中的main函数:命令行参数的工作原理

在C语言中,main函数是程序的入口点。它不仅可以接受返回值,还能处理命令行参数,允许用户在运行程序时传递数据。命令行参数是用户在启动程序时通过命令行界面提供的输入。C语言允许通过main函数的参数来访问这些输入。   int main(int argc…

我在命令行下学日语

同一个动作重复 300 遍,肌肉就会有记忆,重复 600 遍,脊柱就会有记忆,学完五十音图不熟练,经常遗忘或者要好几秒才想得起来一个怎么办?没关系,我做了个命令行下的小游戏 KanaQuiz 来帮助你记忆&a…

c++:vector

一、vector是什么? 1.1 vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是…

一键切换暗黑模式,这些代码片段你不可错过

文章目录 前言正文1.多主题切换2.使用 SASS 实现轻松深色模式3.动画切换浅色与深色模式4.纯 CSS 主题切换5.GitHub 风格的深色模式切换6.持久深色模式7.基本 Vue 响应式切换8.创意灯泡切换 总结 前言 如今,许多网站设计师都会为用户提供浅色和深色模式的选择。这不…

理解为什么要有C++设计模式

什么时设计模式? 每一个模式描述了一个在我们周围不断重复的问题以及该问题的解决方案的核心,这样,就能一次有一次地使用该方案,而不必做重复劳动。 如何解决复杂性? 分解:人们面对复杂性有一个常见的做法…

HJ33 整数与IP地址间的转换

HJ33 整数与IP地址间的转换 整数与IP地址间的转换 描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193 每段数字 …

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年,求伯君用128万行代码编写出了WPS1.0,宣告了中国自主办公时代的开启。 那时候,雷军还在武汉大学深造,他早就把求伯君当成了自己的榜样,这一来二去的,雷军和WPS之间也就结下了不解之缘…

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前,可以回顾…