我如何在Next JS 13中将所有应用程序 Package 在中间件中?

kpbwa7wx  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(167)

我一直在尝试将所有的应用程序都封装在一个中间件中。正如docs所说:

export const config = {
  matcher: [
    /*
     * Match all request paths except for the ones starting with:
     * - api (API routes)
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     */
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
}

我一直在做的是:

export const config = {
  matcher: ['/((?!auth).*)'],
};

因为如果我没有经过身份验证,我想首先向用户显示登录页面。我需要匹配所有的路由内的应用程序除了“/auth”。

vsdwdz23

vsdwdz231#

您可以尝试将整个脚本 Package 在更高阶的组件中。

import { config } from "../path/to/config";
import { NextRouter } from "next/router";
import { AppProps } from "next/app";
import { useEffect } from "react";
import Router from "next/router";

function handleRouteChange(router: NextRouter, url: string) {
  if (!url.match(config.matcher)) {
    // do something here, such as redirect to a login page
  }
}

function MyApp({ Component, pageProps }: AppProps) {
  useEffect(() => {
    const handleRouteChange = (url: string) => {
      if (!url.match(config.matcher)) {
        // do something here, such as redirect to a login page
      }
    };

    Router.events.on("routeChangeStart", handleRouteChange);

    return () => {
      Router.events.off("routeChangeStart", handleRouteChange);
    };
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

每次路由更改时都会调用此方法,它将检查当前URL是否与config中的模式匹配。匹配器
您可以在您认为合适的地方进行适当的更改。

相关问题