【Next】路由处理

概述

在这里插入图片描述
和前端路由一样,后端路由处理也同样采用约定式路由。比如可以在 /api 目录下定义路由文件。但是要注意:route.ts 和 page.tsx 不可以在同一目录下,因为难以区分是渲染页面还是请求接口。

支持以下 HTTP 方法:GET、POST、PUT、PATCH、DELETE、HEAD 和 OPTIONS。如果调用了不受支持的方法,Next.js将返回 405 Method Not Allowed 响应。

注意,在生产环境下,GET 请求默认会进行缓存(Next14)
退出(取消)缓存的方式有:

  • 将 Request 对象与 GET 方法一起使用。
  • 使用任何其他 HTTP 方法。
  • 使用 Cookie 和 Headers 等动态函数。
  • Segment Config Options 手动指定动态模式。

而最新的 Next15 版本中,默认情况下,Route Handlers 中的 GET 函数不再缓存。要将 GET 方法选择到缓存中,您可以使用路由配置选项,例如 export const dynamic = ‘force-static’ 在 Route Handler 文件中。

实例

使用 lowdb 模拟后端数据库,进行 CRUD 操作。

在这里插入图片描述
db.ts

import { JSONFilePreset } from 'lowdb/node'

// Read or create db.json
const defaultData: { posts: {id: string; title: string; content: string}[]} = { posts: [] }
const db = await JSONFilePreset('db.json', defaultData)

export default db;

/api/articles/route.ts

import {NextResponse} from "next/server";
import db from "@/db";

// GET => /api/articles
export async function GET(request: Request) {
}

// POST => /api/articles
export async function POST(request: Request) {
    const result = await request.json();
    await db.update(({posts}) => posts.push({
        id: Math.random().toString(36).slice(-8),
        ...result
    }))
    return NextResponse.json({
        code: 200,
        message: "success",
        data: result
    });
}

/api/articles/[id]/route.ts

// DELETE => /api/articles/:id
import {NextResponse} from "next/server";
import db from "@/db";

export async function DELETE(request: Request, { params }: { params: { id: string } }) {
    await db.update(({posts}) => {
        const index = posts.findIndex(post => post.id === params.id);
        posts.splice(index, 1);
    })
    return NextResponse.json({
        code: 200,
        message: "success",
        data: params.id
    });
}

// PATCH => /api/articles/:id
export async function PATCH(request: Request) {}

// GET => /api/articles/:id
export async function GET(request: Request) {}

测试:

DELETE http://localhost:3000/api/articles/7ea9w8at
Content-Type: application/json
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.7)
Accept-Encoding: br,deflate,gzip,x-gzip


###

POST http://localhost:3000/api/articles
Content-Type: application/json
Content-Length: 68
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.7)
Accept-Encoding: br,deflate,gzip,x-gzip

{
  "title": "Test article",
  "content": "This is a test article"
}
### Vue 路由守卫中 `next` 方法的使用说明 在 Vue 中,路由守卫是一种用于控制页面导航行为的功能模块。其中,`next` 是一个非常重要的函数,在路由守卫中的作用不可忽视。 #### 1. 基本概念 `next` 函数是路由守卫的核心部分之一,它决定了当前导航的行为以及后续操作的方向。无论是在全局前置守卫还是组件内的路由守卫中,都必须调用该方法来完成一次完整的导航过程[^1]。 如果未正确调用 `next()` 或者对其参数设置不当,则可能导致程序无法正常运行甚至陷入死循环等问题[^4]。 --- #### 2. `next` 的常见用法及其含义 以下是几种常见的 `next` 参数配置方式: ##### (1) **无参调用:`next()`** 当直接调用 `next()` 时,表示允许本次导航继续进行并进入目标路径对应的组件渲染阶段。 ```javascript router.beforeEach((to, from, next) => { console.log('即将前往:', to.path); next(); // 继续导航至下一个状态 }); ``` ##### (2) **传入布尔值:`next(false)`** 通过传递 `false` 可终止当前正在进行的导航请求,并返回至上一视图位置(即保持原有界面不变)。 ```javascript router.beforeEach((to, from, next) => { if (!isAuthenticated()) { alert("您尚未登录!"); next(false); // 阻止访问受保护资源 } else { next(); } }); ``` ##### (3) **重定向:`next('/some-path')`** 指定新的地址作为替代方案实现强制跳转功能;此时不会触发原始目的地的相关逻辑处理而是立即转向所提供的 URL 地址处加载新内容显示给用户看。 ```javascript router.beforeEach((to, from, next) => { const requiresAuth = to.matched.some(record => record.meta.requiresAuth); if (requiresAuth && !isLoggedIn()) { next('/login'); // 如果需要身份验证而未登录则自动引导去登陆页 } else { next(); } }); ``` ##### (4) **错误捕获:`next(error)`** 将异常对象交给 Vue Router 处理以便统一展示错误提示信息等额外措施。 ```javascript router.beforeEach((to, from, next) => { try { validateRoute(to.params.id); // 自定义校验业务规则 next(); } catch (error) { next(error); // 将错误交予路由器管理 } }); ``` --- #### 3. 死循环问题分析与解决办法 由于误用了 `next()` 导致无限递归现象发生的情况较为普遍。例如下面这段代码片段就存在潜在风险: ```javascript router.beforeEach((to, from, next) => { if (to.name !== 'Login' && !authService.isAuthenticated()) { next({ name: 'Login' }); // 错误地再次回到 login 页面形成闭环 } else { next(); // 合适情况下才应该放行 } // 缺少必要的出口条件会造成重复调用自身从而引发堆栈溢出错误 }); ``` 为了避免上述情况的发生,可以采取如下改进策略: - 明确判断是否已经处于预期的目标状态下再决定下一步动作; - 对特殊场景单独设立分支避免不必要的多次匹配尝试。 修正后的版本可能看起来像这样子: ```javascript router.beforeEach((to, from, next) => { if (to.name === 'Login') { return next(); // 已经到达 Login 不需进一步干预 } if (!authService.isAuthenticated()) { return next({ name: 'Login' }); } next(); // 默认情形下均予以许可通行 }); ``` --- ### 总结 综上所述,合理运用 `next` 方法能够有效增强应用的安全性和用户体验感。务必牢记其基本语义及适用范围以免引入难以察觉的技术隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值