最新Next14 路由处理器 Route Handlers

news2024/11/24 0:04:39

四、使用Next路由处理程序

Next.js Route Handlers

I. Next中路由处理程序是什么

​ 路由处理程序是在用户访问站点路由时执行的功能。它们负责处理对定义的URL或路由的传入HTTP请求,以生成所需的数据。从本质上讲,当用户访问Next.js应用程序中的特定页面或URL时,相应的路由器会处理用户创建的请求并返回相应的响应,从而呈现所需的内容。

Next.js中的路由处理程序可以有几种形式:

  • 从页面文件导出的函数作为中间件拦截传入的请求

  • 自定义服务器端函数,用于处理Web应用程序中指定路由的请求和响应

​ 总体而言,路由处理程序是Next.js的重要组成部分,允许我们定义自定义路由逻辑并以灵活高效的方式处理传入请求。

​ 使用最新版本创建新的Next.js应用程序现在api目录放置在app文件夹中。这些路由处理程序提供了处理各种请求和响应的内置函数,允许开发人员为特定路由指定自定义行为。这允许更大的灵活性和对如何处理路由的控制,包括重定向到其他页面和提供数据响应。

​ 有了这个新功能,我们在app目录中创建API请求处理程序,可以通过创建HTTP请求方法(如GETPOSTPUT等)匹配的函数并导出。

路由解析注意:

  • 它们不参与布局或客户端导航
  • 在与route.js相同的路由上不能有page.js文件。

II. 创建新的API路由

​ 要创建一个新的API路由,请在app/api目录中创建一个文件夹,并使用路由的名称。在其中,创建一个导出HTTP请求的route.js函数;在本例中,我们将创建一个名为"test"的路由。为此,请在test目录中创建一个新的app/api文件夹,创建一个route.js文件,并向其中添加以下代码:

// In this file, we can define any type of request as follows:
// export async function GET(Request) {}
// export async function HEAD(Request) {}
// export async function POST(Request) {}
// export async function PUT(Request) {}
// export async function DELETE(Request) {}
//  A simple GET Example

export async function GET(Request) {
  return new Response("This is a new API route");
}

运行项目,访问localhost:3000/api/test。这将产生类似于下图的结果:

在这里插入图片描述

III. 构建嵌套路由和动态路由

​ Next 支持动态 API 路由。要创建动态 API 路由,在app/api文件夹中为路由创建username文件夹并定义动态路由。在本例中,我们将在app/api/username目录中创建一个动态路由[user]。然后,在[user]路由中,创建一个包含以下内容的route.js文件:

export async function GET(request, { params }) {
  // we will use params to access the data passed to the dynamic route
  const user = params.user;
  return new Response(`Welcome to my Next application, user: ${user}`);
}

要访问这个API,请打开http://localhost:3000/api/username/[your username]代替用户名。请记住,您可以输入任何字符串-例如,http://localhost:3000/api/username/eric。这将产生以下结果:

在这里插入图片描述

​ 在Next.js中创建嵌套API非常简单。要创建嵌套路由,首先在app/api中定义父API路由。添加到创建的父路由中的任何路由都被视为嵌套路由,而不是单独的路由。

​ 在上面的例子中,我们创建了一个username路由,并在其中嵌套了一个动态路由[user]。在app/api/username中,我们可以在route.js中定义父路由,如下所示:

export async function GET(request) {
  // username parent route
  return new Response("This is my parent route");
}

我们可以通过URL localhost:3000/api/username访问父路由,如下所示:

在这里插入图片描述

访问定义的嵌套路由http://localhost:3000/api/username/[your username]将产生先前的结果。

IV. 创建安全路由

​ 要在Next.js中创建安全路由,需要中间件函数在允许访问路由之前对路由请求进行身份验证和授权。定义安全路由通常遵循一个非常标准的模式。

​ 首先,创建一个中间件函数,它检查传入的请求头、cookie、查询参数等,并确定用户是否被授权访问所请求的资源。如果用户未被授权,应用程序将返回401403状态。

​ 我们可以使用中间件功能定义我们想要保护的路由。下面,我们展示了一个使用NextAuth.js创建的安全路由的示例。先安装对应的包:

npm install next-auth

​ 安装好后,我们可以在api目录中创建一个安全的API路由。首先,我们将使用其提供者定义身份验证选项。创建一个文件夹auth,并在此文件夹中添加一个新文件[…nextauth].js。该文件将包含您选择的任何身份验证措施的选项。

例如,使用Google身份验证提供程序,该选项将定义如下:

import NextAuth from 'next-auth';
import GoogleProvider from "next-auth/providers/google";
const authOptions = {
    providers: [
      GoogleProvider({
        clientId: process.env.CLIENT_ID,
        clientSecret: process.env.CLIENT_SECRET,
        authorization: {
          params: {
            prompt: "consent",
            access_type: "offline",
            response_type: "code"
          }
        }
      })
    ],
  // Add your session configuration here
  session: {
    jwt: true,
  }
};
export default NextAuth(authOptions);

对于安全路由,在api目录中创建一个新文件夹session,并将要保护的路由添加为route.js文件。在session/route.js中,添加以下内容:

import { getServerSession } from "next-auth/next";
import authOptions from "../auth/[...nextauth]";
export async function GET(Request) {
  const session = await getServerSession(authOptions);
  if (session) {
    // Signed in
    console.log("Session", JSON.stringify(session, null, 2));
    return new Response("Welcome authenticated user", {
      status: 200,
    });
  } else {
    // Not Signed in
    return new Response("Unauthorized access detected", {
      status: 401,
    });
  }
}

现在,尝试访问/api/sesssion路由将显示以下结果:

在这里插入图片描述

在这里,应用程序返回响应Unauthorized access detected,状态代码为401

V. Next.js路由器处理程序中的动态和静态生成函数

​ 除了路由函数外,Next 还提供了使用服务器端动态路由函数的功能,如cookie,header和重定向。当访问定义的路由时,在服务器端执行动态函数。

​ 这最适合处理数据上传或请求和访问数据库等任务。通过将路由器处理程序函数定义为动态的,开发人员可以确保更好的性能,因为该函数仅在访问指定路由时执行,从而防止不必要的服务器端处理。

​ 另一方面,静态路由处理程序允许开发人员为指定的路由生成静态内容,这些内容在构建时创建。这对于包含不经常更改的内容的频繁访问的路由特别有用,因此可以提前预呈现。

​ 使用静态函数,开发人员可以减少服务器端处理动态函数的负载,动态函数是为定义的路由生成内容所必需的。正确使用动态和服务器端函数可以使应用程序的性能更高。在解释了动态和静态函数之后,让我们来看看这两个类别下的示例:静态路由器和动态路由器。

静态路由器

在本例中,我们将使用GitHub搜索用户API。对app/api/username目录中的route.js进行以下更改:

import { NextResponse } from 'next/server';
export async function GET() {
  const res = await fetch(
    "https://api.github.com/search/users?q=richard&per_page=3"
  );
  const data = await res.json();
  return NextResponse.json(data);
}

在上面的代码块中,我们向GitHub搜索API执行了一个GET请求,并返回了一个包含三个用户名为"richard"的响应。导航到username路线将产生类似于下图的结果:

在这里插入图片描述

动态路由器

对于动态服务器端功能,我们可以使用cookie、重定向和头。要使用重定向,我们需要为import依赖项添加redirect并指定重定向URL。例如,我们可以在username路由中创建一个重定向URL,如下所示:

import { redirect } from "next/navigation";
const name = "John Doe";
export async function GET(Request) {
  redirect(`http://localhost:3000/api/username/${name}`);
}

在这里,我们将用户重定向到动态[user]路由,并传递沿着一个name变量。重定向也可以与外部URL一起使用到其他网页。

使用服务器端函数,我们还可以指定路由头。这在需要为不同路由指定不同头的情况下特别有用,特别是当路由需要不同的授权承载或身份验证令牌时,如下所示:

// Import for the headers dependency
import { headers } from 'next/headers';
export async function GET(Request) {
  const useHeader = headers(Request);
  const header = useHeader.get('content-type');
  return new Response('We are using the content-type header!', {
    status: 200,
    headers: { 'content-type': header }
  });
}

在上面的代码块中,我们使用了来自headersnext/headers函数来从传入的request对象中获取传递给路由器的头。然后,我们使用Route函数中的GET方法来提取content-type参数的值。

最后,我们创建一个状态为200的新响应,并将头设置为Request头的值。Next 13.2中路由头的一个主要改进是,它们现在可以根据传入请求的响应或正在获取的数据动态执行。

参考链接:

  • Using Next.js Route Handlers

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

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

相关文章

全新智能后备保护器综合产品解决方案

SCB后备保护器是一种用于浪涌保护器(SPD)的专用外置脱离器,它可以有效地防止SPD因故障或短路而引起的火灾和设备损坏,同时保证SPD在雷电流冲击下不误动作,维持电气设备的防雷保护状态。地凯科技将介绍后备保护器的应用…

pycharm remote host显示nothing to show

远程服务器remote host右侧消失解决方法_dl_风禾的博客-CSDN博客文章浏览阅读727次。remote host打开方法https://blog.csdn.net/weixin_43959436/article/details/127818707?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169940685316800197099235%2522%252C%252…

软件开发项目文档系列之十三如何撰写用户操作手册

目录 1 引言1.1 目的1.2 系统概述1.3 参考资料1.4 文档格式 2 系统运行环境2.1 系统硬件环境2.2 系统软件环境 3 系统设置说明3.1 公告发布3.2 角色管理3.3 通用管理 4 用户账户与访问说明4.1 注册与登录4.2 密码管理 5 数据管理说明5.1 数据导入与导出5.2 数据备份与还原 6 帮…

二维码智慧门牌管理系统升级解决方案:高效、安全、便捷

文章目录 前言一、用户管理二、菜单管理三、角色管理四、字典管理五、权限管理六、日志管理 前言 随着科技的不断发展,传统门牌管理系统已经无法满足现代管理的需求。为了提高管理效率,降低安全风险,并实现便捷的日志管理,二维码…

JAVA综合知识点总结-基础篇(4)

三十一、平时浏览的书籍..................................................................................... 三十二、java Exception体系结构......................................................................... 三十三、session和cookie的区别...........…

小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口

淘宝商品销量接口是淘宝开放平台提供的一种API接口,通过该接口,商家可以获取到淘宝平台上的商品销量数据。使用淘宝商品销量接口的步骤如下: 1、在淘宝开放平台注册并创建应用,获取API Key和Secret Key等必要的信息。 2、根据淘宝…

可完美兼容迪文的串口屏?

如何让屏幕识别迪文协议,下面介绍淘晶驰USART HMI上位机用法 首先在工程输入0000-fffe 然后在program.s输入recmod2,在控件列表里就会刷新带有_vp的控件 带_vp的控件可以像迪文一样使用地址 导入字库,输入项目地址,根据通信协议来…

舞台灯光专用电机驱动及应用方案

舞台灯光的运用是舞台艺术中不可或缺的重要手段,达到突出重点、塑造人物形象、烘托环境气氛的目的;在舞台灯光的使用过程中,会对灯光的角度有较多的要求而步进电机具有较好的调节性;且控制方式更加灵活多样;能满足舞台…

配置阿里云镜像加速器 -docker

1.百度aliyun 2.找到镜像服务ACR 3.搞一个个人版,身份验证一下就行了很简单 4.找到镜像加速器Centos 5.在xshell执行下面4条命令:4条命令直接从上面操作文档中粘贴,不容易出错 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json…

企业如何选型iPaaS平台

企业数字化转型已是大势所趋,伴随着我国数字化转型改革的不断深入,加快推进企业数字化转型是新发展格局下实现经济高质量发展的必由之路。 企业在数字化转型过程中会搭建众多应用系统,以解决不同业务部门的需求。但系统之间如果互不连通&…

康其农业:西藏“高原红”苹果,成就世界屋脊的乡村振兴典范

金秋,阳光打在青藏高原,贡嘎山坡上的苹果树更显挺拔葱茏。清风拂过,一个个鲜红欲滴的苹果挂在枝叶之间,轻盈摇曳,像是在朝人们的味蕾招手。 康其农业集团董事长朱秋林抚摩着累累果实,笑容在双颊上绽开。 …

【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队

一、 一条简单SQL在MySQL执行过程 一张简单的图说明下,MySQL架构有哪些组件和组建间关系,接下来给大家用SQL语句分析 例如如下SQL语句 SELECT department_id FROM employee WHERE name Lucy AND age > 18 GROUP BY department_id其中name为索引&a…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发002:框架学习-按照三层结构模式重构测试代码+Tcp数据适配+时间轮定时器

文章目录 1 Zinx框架总览2 三层模式的分析3 三层重构原有的功能 - 头文件3.1 通道层Stdin和Stdout类3.1.2 StdInChannel3.1.2 StdOutChannel 3.2 协议层CmdCheck和CmdMsg类3.2.1 CmdCheck单例模式3.2.1.1 单例模式3.2.1.2 * 命令识别类向业务层不同类别做分发 3.2.2 CmdMsg自定…

传统库分表麻烦查询慢?TDengine 如何解决“搜狐基金”的应用难题

该项目需要实时展示国内基金的净值和收益(货币基金),在保证满足折线图展示的功能基础上,还需要加入统计排行、分页展示等功能,为用户提供最全面实时的查询服务。此前搜狐基金团队使用的 MySQL 数据库在面对海量数据时存…

linux粘滞位的介绍及使用

文章目录 1.粘滞位的引入2.粘滞位的使用 1.粘滞位的引入 首先看一个场景 已知 对目录无w权限时 无法进行目录中的文件的创建/删除操作但是普通用户通过sudo命令 以root身份创建一个文件 rw- r-- r-- 普通用户此时是other 没有w权限 但却可以删除 [root和普通用户在一个目录下时…

【LittleXi】ICPC2023 南京站 总结

【LittleXi】ICPC2023 南京站 总结 赛前: 一周两次的vp训练 cf div2正常打、补题、沉淀,顺便vp了两把(网瘾了) 热身赛 熟悉了一下键盘,顺便交了一下A题的随机算法 测试评测了bitset、map、hashmap、打印时间&…

立冬问候语,立冬祝福语图片大全,温暖您整个冬天

立冬了,花落的声音冬知道,关爱的感觉心知道,立冬快乐,天凉保重! 立冬寒气从天降,保重身心体健康,出入平安鸿运照,幸福快乐又吉祥,立冬,祝朋友们冬天幸福快乐安…

SpringBoot整合Canal+RabbitMQ监听数据变更(对rabbit进行模块封装)

SpringBootCanal(监听MySQL的binlog)RabbitMQ(处理保存变更记录) 在SpringBoot中采用一种与业务代码解耦合的方式,来实现数据的变更记录,记录的内容是新数据,如果是更新操作还得有旧数据内容。 使用Canal来监听MySQL的…

埃隆·马斯克旗下xAI推出PromptIDE工具,加速提示工程和可解释性研究

🦉 AI新闻 🚀 埃隆马斯克旗下xAI推出PromptIDE工具,加速提示工程和可解释性研究 摘要:埃隆马斯克旗下人工智能初创公司xAI推出了PromptIDE工具,该工具是一个用于提示工程和可解释性研究的集成开发环境。通过该工具&a…

MATLAB|怎么将散点图替换成图片

目录 效果图 工具箱函数 输入参数: 输出参数 使用教程 案例1 案例3 案例4 案例5 案例6 案例7 案例8 扫一扫关注公众号: 今天教大家怎么把散点图替换成自己喜欢的图片,喜欢此推文的小伙伴们记得点赞关注分享! 效果图 看了slandare…