我在 nextjs 中间件中面临一个问题我正在构建一个电子商务应用程序,该应用程序在中间件中有三个参与者 [admin 、 customer 、vendor] 我有一个函数可以从标头 cookie 中解码令牌,然后返回包含用户电子邮件、id 等的数据逻辑路由中的一切都工作良好,身份验证是完美的问题是,当用户单击“客户/购物车或帐户”之类的路径时,我想验证他是否实际上是注册用户,如果不是中间件将其重定向到身份验证/登录问题是它将身份验证/登录的网址重写为客户/帐户,因此登录后我有像 router.push('/customer/account') 这样的代码似乎不起作用,它在重写中造成了彻底的混乱有什么方法可以防止重写并可以使用重定向吗???
中间件.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { getDataFromToken } from './helpers/auth'
export async function middleware(request: NextRequest) {
const path = request.nextUrl.pathname
const token = request.cookies.get('token')?.value || ''
const userData = await getDataFromToken(request)
console.log("🚀 ~ file: middleware.ts:13 ~ middleware ~ userData:", userData)
// admin validation
const isAdminPath = path.startsWith('/admin');
if (isAdminPath && (token === '' || userData?.role !== 'admin')) {
return NextResponse.rewrite(new URL('/auth/login', request.url))
}
// customer validation
const isUserAccount = path.startsWith('/customer/account');
const isUserCart = path.startsWith('/customer/cart');
if (token && token !== '' && userData?.role === 'customer') {
return NextResponse.rewrite(new URL('/customer/account', request.url))
}
if ((isUserAccount || isUserCart) && (token === '' || userData?.role !== 'customer')) {
return NextResponse.rewrite(new URL('/auth/login', request.url))
}
}
export const config = {
matcher: [
'/customer/account',
'/customer/cart',
'/admin',
],
}
修好了
示例
if (request.nextUrl.pathname.startsWith('/admin'))
{
if (token === '' || userData === null || userData?.role !== 'admin') {
return NextResponse.redirect(new URL('/auth/login', request.url))
}
}
if (request.nextUrl.pathname === '/auth/login' || request.nextUrl.pathname === '/auth/register')
{
if ((token !== '' || !token) && userData !== null && userData?.role === 'admin') {
return NextResponse.redirect(new URL('/admin/home', request.url))
}
}
我们只需替换 Rewrite 即可使用 Redirect 。这为我解决了问题