无法在 NextJs 中间件函数中使用 fetch

问题描述 投票:0回答:1

如果 Laravel 的身份验证令牌无效,我尝试将用户重定向到 /login。因此,我尝试获取用户,如果 resp.ok() 为 false,则删除无效的“令牌”cookie 并将用户重定向到 /login。但我的浏览器中不断出现错误。

这是关于下面代码示例中的第三个 if 语句。

错误:页面未正确重定向 Firefox 已检测到 服务器正在以以下方式重定向对此地址的请求 永远不会完成。此问题有时可能是由于禁用 或拒绝接受cookies。

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

export async function middleware(req: NextRequest) {
  // Add protected routes here
  const url = req.nextUrl.clone();

  if (req.nextUrl.pathname === "/login" && req.cookies.has("token")) {
    url.pathname = "/";
    return NextResponse.redirect(url);
  }

  if (
    !req.cookies.has("token") &&
    req.nextUrl.pathname !== "/login" &&
    !req.nextUrl.pathname.startsWith("/_next")
  ) {
    url.pathname = "/login";
    return NextResponse.redirect(url);
  }
  
  if (req.cookies.has("token")) {
    const user = await fetch(`http://10.129.23.206:8080/api/user`, {
      headers: {
        "Authorization": `Bearer ${req.cookies.get("token")}`,
      }
    })
    
    console.log(user)

    if (!user.ok){
      req.cookies.delete("token")
      url.pathname = "/login";
      return NextResponse.redirect(url)
    }
  }
}

export const config = {
  matcher: ["/", "/create", "/search", "/:slug*", "/login"],
};
typescript laravel next.js middleware
1个回答
0
投票

我认为获取用户失败,然后在这个

if
块中

if (!user.ok){
      req.cookies.delete("token")
      url.pathname = "/login";
      return NextResponse.redirect(url)
    }

您正在删除令牌,之后当您发出另一个没有令牌的请求时,因此此

if
将被执行,并且您将再次重定向到“登录”:

if (
    !req.cookies.has("token") &&
    req.nextUrl.pathname !== "/login" &&
    !req.nextUrl.pathname.startsWith("/_next")
  ) {
    url.pathname = "/login";
    return NextResponse.redirect(url);
  }

获取用户代码应该是

try/catch
块,并且在catch块中你应该相应地处理错误。也许您将消息发送到浏览器,浏览器将在表单上显示错误而不是再次重定向。

© www.soinside.com 2019 - 2024. All rights reserved.