在next js 14中删除cookie的问题

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

我想知道为什么 next js 中的 request.cookies.delete 不起作用,我已经使用了 noookies 库,next/headers 中的 cookies,但它仍然不起作用。我的代码是这样的:

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
 
export async function middleware(request: NextRequest) {
    const hasCookie = request.cookies.has("token")
    const cookie = request.cookies.get("token")
    const url = process.env.URL

    if(cookie){
      const getCookie = cookie.value
      const res = NextResponse.next()

      const response = await fetch(`${url}/verifyExpToken`, {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${getCookie}`
        }
      })

      const data = await response.json()

      if(data.error){
        request.cookies.delete("token")
        return NextResponse.redirect(new URL('/login', request.url))
      }
  }

  if(!hasCookie){
    return NextResponse.redirect(new URL('/signIn', request.url))
  }
}
 
export const config = {
  matcher: ["/home", "/cart", "/contact", "/exploreCourses", "/plains"]
}

它甚至最终进入重定向并重定向到登录,因为令牌实际上已经过期,但我查看了检查元素并查看了应用程序选项卡,然后我转到了 cookie,它仍然在那里,我不知道发生了什么事,直到前天它还在工作哈哈

next.js cookies request response middleware
1个回答
0
投票

我在阅读了有关next和中间件的一些内容、查阅文档后得到了它,request.cookies仅从到达它的请求中删除cookie,而不是从浏览器中删除cookie,即使它刷新页面,也只有那些从浏览器中删除它的人浏览器是response,也就是nextResponse,因为中间件接收到请求,到浏览器的是response,所以只会通过response反映浏览器中cookie的删除,代码如下。

import { NextResponse, NextRequest} from 'next/server'

function verifyToken(request: NextRequest){
  const hasCookie = request.cookies.has("token")

  if(!hasCookie){
    return NextResponse.redirect(new URL("/login", request.url))
  }
}
 
export async function middleware(request: NextRequest) {
  const cookieValue = request.cookies.get("token")?.value
  const url = process.env.URL

  const verifyExpToken = await fetch(`${url}/verifyExpToken`, {
    method: "POST",
    headers: {
      "Authorization":  `Bearer ${cookieValue}`
    }
  })

  const verifyExpTokenError = await verifyExpToken.json()

  const response = NextResponse.next()

  if(verifyExpTokenError.error){
    response.cookies.delete("token")
    verifyToken(request)
  }
  return response
}
export const config = {
  matcher: ["/home", "/cart", "/contact", "/exploreCourses", "/plains"]
}

请注意,我在删除 cookie 后重定向了用户,因为他应该再次登录,但通过中间件,我仅使用 return NextResponse 重定向用户,但要删除 cookie,您需要返回它,以便它可以继续到浏览器,但是如何重定向并将响应返回到浏览器,两者都是返回,并且在javascript返回之后无法添加更多代码,我创建了一个重定向的函数,并在它返回响应之后,因为该功能超出了中间件的范围。

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