• 首页
  • 分类
  • 归档
  • 作品
  • 关于

Nextjs基础-动态博客(三)

Next的中间件与权限控制

前言

在spa单页开发的时候,我们可以通过react-router来进行路由拦截,实现权限控制,一般方案是向浏览器写入cookie,然后判断cookie中的token。那么在Next中呢?Next使用了中间件的方式,这个express中也有这个概念。用白话理解就是每次路由变换先经过中间件,无论这个组件是否被缓存。那么这个时候就可以通过中间件来进行鉴权。

中间件

import { NextResponse } from 'next/server'
 
// 如果在里面使用“等待”,这个函数可以标记为“异步”
export function middleware(request) {
  return NextResponse.redirect(new URL('/home', request.url))
}
 
// 请参阅下面的“匹配路径”以了解更多信息
export const config = {
  matcher: '/about/:path*',
}

这里是Next中的一个例子,里面包含一个middleware函数,一个config对象。这个代码你可能看的有些疑惑,什么是NextResponse.redirect?这个可以理解为在Next服务端中重定向的方法。没错,中间件的作用其实就是路由的调度。根据配置的信息,来看用户是否能通过这条路由。

匹配路径

匹配路径非常重要,有些路由需要中间件,有些路由不需要中间件,可以通过它来配置。

config是匹配器,如例子中的 matcher: '/about/:path*'就表示在about以及它下面的子路由,都经过中间件,那么其他的都不经过中间件。当然,它还可以写成一个数组的形式。不过很麻烦。这里还有第二种匹配路径的方式,写条件语句。

条件语句的方式就很像在写react类组件的componentDidUpDated生命周期。通过条件语句的方式对更新的状态做出判断,还能写多个条件语句处理不同的状态更新。

import { NextResponse } from 'next/server'
 
export function middleware(request) {
  if (request.nextUrl.pathname.startsWith('/about')) {
    return NextResponse.rewrite(new URL('/about-2', request.url))
  }
 
  if (request.nextUrl.pathname.startsWith('/dashboard')) {
    return NextResponse.rewrite(new URL('/dashboard/user', request.url))
  }
}

也非常好理解。

进行设置

中间件的作用如果只是在匹配路径进行鉴权可太大材小用了。对于每个api路由来说,他们也会经过中间件,所以每次请求就可以利用中间件进行操作。比如操作cookie,设置Headers,管理响应。

不过这些远没有鉴权重定向使用频繁。

细节

middleware这个js文件需要与app文件夹是同级目录,都在src下。