我正在学习Next. js-version 13,我尝试根据标准文档自定义Next.js应用程序。但不知何故,中间件没有被调用。我认为我在这里做错了什么。如果你有时间,请回顾这个问题。
以下是中间件.ts的代码更改:
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { AUTHORIZATION_TOKEN, COOKIE_TOKEN } from "@libs/constants";
import { verify } from "@libs/token";
export const config = {
matcher: ["/admin/:path*", "/signin", "/api/:path*"],
};
export async function middleware(request: NextRequest) {
const url = request.nextUrl.clone();
const regex = new RegExp('\\/api\\/(category|product|cart|coupon|auth)\\/(create|update|delete)', 'i')
let matcher: any = regex.exec(url.pathname);
let token: any;
let isValidToken: any;
if (matcher && matcher[0]) {
token = request.headers.get(AUTHORIZATION_TOKEN);
isValidToken = await verify(token);
} else {
token = request.cookies.get(COOKIE_TOKEN)?.value;
if (token) {
isValidToken = await verify(JSON.parse(token));
}
if (url.pathname.startsWith("/admin")) {
if (isValidToken) {
return NextResponse.next();
} else {
url.pathname = "/signin";
return NextResponse.redirect(url);
}
}
if (url.pathname.startsWith("/signin") && isValidToken) {
url.pathname = "/admin";
return NextResponse.redirect(url);
}
}
return NextResponse.next();
}
及项目结构:
enter image description here
在这种情况下,有人有什么建议吗?如果我错了,请纠正我。非常感谢。
1条答案
按热度按时间jexiocij1#
我有类似的问题。我已经移动了我的
middleware.ts
文件在src
文件夹中,如:/src/middleware.ts
,现在它被调用了。根据你的截图,看起来你的middleware.ts不在/src
文件夹中。还要记住,你不能在中间件函数中执行IO操作,比如调用DB,你仍然可以等待承诺或者通过
fetch
调用其他服务。