我认为通过路由的客户端导航和中间件的使用存在问题.

当我刷新浏览器时,这种情况就会停止.

我想强制路由每次进入中间件,以重新判断重定向到哪里.

要复制:

  1. 重复从浏览器搜索栏转到/.由于middleware.ts,你有50%的几率被重定向到/dashboard,50%的几率被重定向到/profile
  2. 转到/login并单击登录按钮.这将生成router.push('/')并重定向到/dashboard/profile.
  3. 单击注销按钮.这将是router.push('/login').
  4. 下次登录时,将始终重定向到同一路径.

这是我的middleware.ts:

export function middleware(request: NextRequest) {
  if (request.nextUrl.pathname === '/') {
    if (Math.random() > 0.5) {
      return NextResponse.redirect(new URL('/dashboard', request.url))
    } else {
      return NextResponse.redirect(new URL('/profile', request.url))
    }
  }
}

login.tsx年款:

import { NextPage } from 'next'
import { useRouter } from 'next/router'

const LoginPage: NextPage<{}> = () => {

  const router = useRouter()
  const login = () => {
    router.push('/')
  }

  return (
    <div>
      <h1>Login</h1>
      <button onClick={login}>Login</button>
    </div>
  )
}

export default LoginPage

和仪表板/配置文件页面:

import { NextPage } from 'next'
import { useRouter } from 'next/router'

const DashboardPage: NextPage<{}> = () => {
  const router = useRouter()

  const logout = () => {
    router.push('/login')
  }

  return (
    <div>
      <h1>DashboardPage</h1>
      <button onClick={logout}>Logout</button>
    </div>
  )
}

export default DashboardPage

这是Vercel中显示的站点:https://nextjs-router-clientside-test.vercel.app/

这是完整的代码:https://github.com/LautaroRiveiro/nextjs-router-clientside-test

推荐答案

这是本GH issue #30938中描述的默认预期行为.

这是意料之中的,因为我们正在缓存HEAD请求,以尽可能减少仍然存在问题的请求量(#30901).

但是,在中间件中重定向之前,可以通过将x-middleware-cache头设置为no-cache值(请参阅相关的PR #32767),停止缓存头请求,并在客户端导航上强制重新验证它们.

export function middleware(request: NextRequest) {
    if (request.nextUrl.pathname === '/') {
        const redirectUrl = Math.random() > 0.5 ? '/dashboard' : '/profile'
        const response = NextResponse.redirect(new URL(redirectUrl, request.url))
        response.headers.set('x-middleware-cache', 'no-cache') // Disables middleware caching
        return response;
    }
}

Javascript相关问答推荐

如何访问Json返回的ASP.NET Core 6中的导航图像属性

微软Edge Select 间隙鼠标退出问题

IMDB使用 puppeteer 加载更多按钮(nodejs)

模块与独立组件

使用下表中所示的值初始化一个二维数组

如何为我的astro页面中的相同组件自动创建不同的内容?

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

第二次更新文本输入字段后,Reaction崩溃

如何在Angular拖放组件中同步数组?

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

如何 for each 输入动态设置输入变更值

如果NetSuite中为空,则限制筛选

每隔3个项目交替显示,然后每1个项目交替显示

使用可配置项目创建网格

谷歌饼图3D切片

更新文本区域行号

如何向内部有文本输入字段的HTML表添加行?

无法在Adyen自定义卡安全字段创建中使用自定义占位符

JSX/React -如何在组件props 中循环遍历数组

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行