如何取消保护下一个js中间件中的路由

How to unprotect route in next js middleware

所以我想取消对登录页面的保护,这是我的文件夹结构:

这是我的中间件:

import { NextResponse, NextRequest } from "next/server";

export async function middleware(req, ev) {
  if (req.pathname === "login") {
    return NextResponse.next();
  }
  const token = req.cookies.token;

  if (!token) {
    return NextResponse.redirect("/login");
  }
  return NextResponse.next();
}

那么我该怎么做才能使中间件不适用于 login.js。

编辑:现在returns[webpack.cache.PackFileCacheStrategy] Caching failed for pack: Error: Unable to snapshot resolve dependencies

此项目的代码是 here

您可以检查 request 是否针对 /login 页面本身,并提前退出。

检查 NextRequest 上所有可用的属性。

import { NextResponse, NextRequest } from "next/server";

export async function middleware(req, ev) {
  if( req.pathname === 'login'){
      return NextResponse.next();
  }
  const token = req.cookies.token;

  if (!token) {
    return NextResponse.redirect("/login");
  }
  return NextResponse.next();
}

所以我解决了没有从 req.nextUrl 获取路径名的错误,这是正确的代码:

import { NextResponse, NextRequest } from "next/server";

export async function middleware(req, ev) {
  const { pathname } = req.nextUrl;
  const token = req.cookies.token;

  if (pathname == "/login" && !token) {
    return NextResponse.next();
  }

  if (!token) {
    return NextResponse.redirect("/login");
  }

  return NextResponse.next();
}

接受的答案对我帮助很大。我正在添加我的解决方案,因为我必须进行一些修改。

我将 [...nextauth].js 文件与 jwtsession 回调一起使用,当我使用接受的答案中的解决方案时,我得到了 ERR_TOO_MANY_REQUESTS 循环。我的解决方案是再添加几个 URL:

import { NextResponse } from "next/server";
import { getToken } from 'next-auth/jwt';

export default async function middleware(req, ev) {
  const { pathname } = req.nextUrl;
  const token = await getToken({ req, secret: process.env.JWT_SECRET });

  if ((pathname == "/api/auth/signin" || pathname == "/favicon.ico" || pathname == "/api/auth/callback/credentials") && !token) {
    return NextResponse.next();
  }

  if (!token) {
    return NextResponse.rewrite(new URL('/api/auth/signin', req.url));
  }

  return NextResponse.next();
}