自定义应用程序Next.js 13之后,中间件不工作

lokaqttq  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(262)

我正在学习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
在这种情况下,有人有什么建议吗?如果我错了,请纠正我。非常感谢。

jexiocij

jexiocij1#

我有类似的问题。我已经移动了我的middleware.ts文件在src文件夹中,如:/src/middleware.ts,现在它被调用了。根据你的截图,看起来你的middleware.ts不在/src文件夹中。
还要记住,你不能在中间件函数中执行IO操作,比如调用DB,你仍然可以等待承诺或者通过fetch调用其他服务。

相关问题