我有一个客户端组件,它检查身份验证状态,并被合并到app/layout.tsx
中。目标是确定用户是否已登录。否则,如果当前URL路径不是/login
,则用户将被重定向到登录页面。如果用户已登录,如果当前URL路径为/login
,则用户将重定向到/
。代码如下:
(Firebase)
onAuthStateChanged(auth, (user) => {
if (user) { // if user is logged in
if (path === "/login") {
router.push("/");
}
} else { // if user is not logged in
if (path !== "/login") {
router.push("/login");
}
}
});
请注意,使用此代码,如果用户未登录,则无法访问任何404页面。如果用户这样做,代码将重定向到登录页面,这是我不希望的。为了防止这种情况,我需要检测它是否是一个404页面。
那么,我如何检查它是否是Next.js 13的404页面?
如果您需要任何其他信息来解决问题,请告诉我。
2条答案
按热度按时间vzgqcmou1#
Next.js和错误处理
在
Next.js
中,内置的错误页面组件_error.js
或_error.tsx
位于/pages目录中,处理所有错误代码,包括404。但是,它并没有直接提供一种机制来检查当前页面是否是来自另一个组件的404。一个可能的解决方案是在根组件
layout.tsx
中设置一个状态,每当Error页面组件被触发时,该状态就会改变。您可以通过React
上下文或您选择的状态管理库来实现这一点。让我们继续我的方法:
首先,我们需要构建一个上下文。我为这个案例创建了一个
NotFoundContext
。验证码:
现在我们需要用我们定义的
NotFoundProvider
Package 应用程序。验证码:
我们需要调整
_error.js
或_error.tsx
以反映isNotFound
状态。只需在js
或tsx
文件中将isNotFound
设置为true即可。验证码:
现在,
isNotFound
可以在您自己的组件中访问和使用。验证码:
我希望这对你有帮助!
am46iovg2#
通常,重定向或身份验证在中间件文件或 Package 文件中处理。如果您仍然希望遵循您的方法,则应在应用程序中手动定义所有路由