首页 > 其他分享 >如何以干净的方式在 NextJs 中创建请求中间件

如何以干净的方式在 NextJs 中创建请求中间件

时间:2022-09-26 12:13:06浏览次数:85  
标签:请求 NextApiResponse res req 中间件 NextJs 处理程序

如何以干净的方式在 NextJs 中创建请求中间件

中间件是每个 API 的一个重要方面,它们在 NextJs 项目中也很有用,但官方文档没有教你如何实现它们,幸好你找到了这篇我将教你如何添加请求中间件的文章到您的 NextJs 应用程序!

NextJs 12.2 版本带来了新的概念 中间件 .这是一个不错的概念,您应该检查一下,但是 这不是我们要在本指南中讨论的内容。

如何制作你的第一个中间件

拿起你的 NextJs 项目并添加一个名为 withHello.ts .把它放在任何你想要的地方,除了保留 /页 目录;与 NextJs 框架中的其他内容不同,我们将使用的文件路径和名称没有任何功能价值。

正如您可能从文件名中猜到的那样,我们将使用 打字稿 还要解决打字部分。通过删除类型注释,您可以使用纯 JavaScript 轻松复制所有内容

这是我们的中间件代码 console.log("Hello World") 在每个请求上(别担心,我们也会探索一些真实的用例,这只是为了解释流程)。

 导出常量 **与你好** =  
 (处理程序:NextApiHandler)=> **// 1**  
 (req: NextApiRequest, res: NextApiResponse) => { **// 2**  
 console.log("Hello World!");  
    **返回处理程序(req,res);** **// 4**  
 };
  1. 中间件是一个接受 处理程序 (最终一些 选项 ,见 验证示例 )
  2. 该函数返回一个闭包 请求 资源 参数
  3. 在闭包的主体内部,我们可以执行任何我们想要的操作,同时可以访问 请求 资源
  4. 最后,我们返回 处理程序 随着 请求 资源 最终可以使用附加值进行修改(参见 身份验证示例 )

要使用中间件,只需将 处理程序 您要应用它的路线的功能

 const handler = async (req: NextApiRequestWithAuth, res: NextApiResponse) => {  
 ...  
 } 导出默认值 **withHello(处理程序)**

这是中间件系统如何工作的基本解释,如果您希望看到我们所学的一些真实示例,请继续阅读

如何制作认证中间件

中间件最常见的用例之一是在特定路由上执行身份验证,以保护其免受未经身份验证或未经授权的用户的攻击。

这是使用 JWT 验证制作基本身份验证中间件的方法

 导出类型 CustomNextApiHandler  
 TReq 扩展 NextApiRequest = NextApiRequest,  
 TRes 扩展 NextApiResponse = NextApiResponse  
 > = (req: TReq, res: TRes) => 未知 |承诺<unknown>; 导出类型 NextApiRequestWithAuth = NextApiRequest & {  
 用户ID:字符串;  
 }; 导出常量 **withAuth** =  
 (  
 处理程序:CustomNextApiHandler<NextApiRequestWithAuth>  
 ) =>  
 (req: NextApiRequestWithAuth, res: NextApiResponse) => {  
 常量 { 授权 } = req.headers; 如果(!授权){  
 返回 res.status(403).json({ message: "Unauthorized" });  
 } 别的 {  
 const token = authorization.split(" ")[1]; jwt.verify(token, process.env.JWT_SECRET!, (err, payload) => {  
 如果(错误 || !有效负载){  
 返回 res.status(403).json({ message: "Unauthorized" });  
 }  
        **req.userId = (payload as {uid: string}).uid;**  
 返回处理程序(req,res);  
 });  
 }  
 };

用法与第一个示例相同。正如你所看到的,我们正在注入一个自定义的中间件 用户身份 撑进 请求 可以在处理程序内部访问

 const handler = async (req: **NextApiRequestWithAuth** , res: NextApiResponse) => {  
 返回 res.status(200).json({ message: "Hello" + **req.userId** });  
 } 导出默认值 **withAuth(处理程序)** ;

如何制作验证中间件

中间件的另一个用例是验证输入数据,在下一个示例中,我们将了解如何做到这一点,同时学习如何将自定义选项传递给我们的中间件。

在这个例子中,我们使用 是的 作为我们的模式验证库,但您可以使用您最熟悉的任何库来获得相同的结果

 类型 **WithValidationOptions** = {  
 bodySchema?: 是的.AnyObjectSchema;  
 }; 导出常量 **带有验证** =  
 (处理程序:NextApiHandler, **选项:WithValidationOptions** ) =>  
 async (req: NextApiRequest, res: NextApiResponse) => {  
 尝试 {  
 等待 options.bodySchema?。 **验证(req.body)** ;  
 } 捕捉(错误){  
 如果(错误实例验证错误){  
 返回 res.status(400).json({ message: error.errors[0] });  
 }  
 }  
 返回 **处理程序(请求,资源)** ;  
 };

要使用它,只需像我们之前所做的那样包装处理程序,作为第二个参数,您可以传递选项。在这种特殊情况下,通过验证模式!

 ...  
 导出默认值 **带有验证** (处理程序, **{  
 bodySchema:是的。形状({  
 refreshToken: 是的.string().required(),  
 }),  
 }** );

感谢您阅读本文,希望您觉得这篇文章有用,如果是,请考虑为它鼓掌,关注我以获取更多内容,或在评论中提出任何问题。再见!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39468/57042611

标签:请求,NextApiResponse,res,req,中间件,NextJs,处理程序
From: https://www.cnblogs.com/amboke/p/16730430.html

相关文章

  • SpringBoot中请求拦截体系
    【拦截器】importcn.hutool.core.util.ObjectUtil;importcn.hutool.core.util.StrUtil;importorg.springframework.web.bind.ServletRequestUtils;importorg.spr......
  • put请求中文乱码问题
    运行脚本发现post请求中,中文显示正常,而put请求中,中文乱码了在配置文件jmeter.properties中,已经设置了sampleresult.default.encoding=UTF-8,但是对put请求没有生效解决......
  • fastapi_token权限管理和中间件
    token验证逻辑写在中间件里koa中的中间件的位置前端在header中发送token的处理token权限管理等级管理......
  • Chrome插件开发background_js支持跨域请求与返回async和await的处理
    background.js的配置chrome.runtime.onMessage.addListener((request,sender,sendResponse)=>{switch(request.type){case'fetchChromeXmlrpc':......
  • GET请求和POST请求参数
             ......
  • 请求库之selenium
    一、介绍selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操......
  • http协议详解:HTTP报文、请求方法、HTTP状态码
    简介HTTP协议,即超文本传输协议(Hypertexttransferprotocol)。是一种详细规定了浏览器和万维网(WWW=WorldWideWeb)服务器之间互相通信的规则,通过因特网传送万维网文......
  • 请求库之requests库
    目录一、介绍二、基于get请求三、基于post请求一、介绍#介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#......
  • 【Springboot之搜索日志妙招】在日志上打印请求唯一log标识
    在每次请求中打出的每条日志中添加统一的请求唯一标识。通过搜索日志唯一标识,这样就可以非常高效精准排查问题;例如:2018-12-2110:21:26.329[http-nio-8080-exec-2][......
  • Flask学习笔记(二)-request请求对象+flask解析http请求数据
    一、flask请求对象requestrequest是flask框架的全局对象,你可以通过它来获得当前进入的请求数据,如果是在多线程环境下,flask可以保证你所使用的request对象就是当前这个线程......