NextJS 应用暂时显示受限路由组件

Posted

技术标签:

【中文标题】NextJS 应用暂时显示受限路由组件【英文标题】:NextJS app temporarily shows restricted route component 【发布时间】:2021-08-02 06:16:31 【问题描述】:

我正在尝试全局保护路径名中包含“dashboard”的所有路由,但是当我键入“/dashboard”时它会显示组件大约 1 秒钟,然后才重定向/login

如何在/dashboard 组件加载之前将用户重定向到/login?我不希望未经身份验证的用户看到该组件。

export const AuthContextProvider: FC<Props> = ( children ) => 
  const [admin, setAdmin] = useState<Partial<Admin>>(null);
  const router = useRouter();
  const  loading  = useCurrentAdminQuery(
    onCompleted: (data) => 
      setAdmin(data.currentAdmin);
    ,
    onError: () => 
      if (router.pathname.includes('dashboard'))
        return router.replace('/login');
    ,
    fetchPolicy: 'network-only',
  );

  if (loading) return <div>loading...</div>;

  return (
    <AuthContext.Provider value= admin, setAdmin >
      children
    </AuthContext.Provider>
  );
;

【问题讨论】:

【参考方案1】:

Providers 是浏览器 ReactJS 功能,而不是服务器端功能。您的用例需要一个服务器端版本。

例如,每个 Page 对象都应在服务器端测试您的身份验证规则。

const MyPage = () => (
 <div> This is protected content </div>  
)

export async function getServerSideProps() 
  // test your authentication logic here
  
  // Redirect when not logged-in
  return 
     redirect: 
        destination: '/login',
        permanent: false,
     ,
  ;

  // If all went well, pass some props, like username
  return  props:  username: 'john'  

或者您可以阅读有关 NextJS 身份验证的章节。您可以使用useUser 挂钩,它将您重定向到登录页面。

我认为目前还没有一个简单的解决方案可以使用 NextJs 来“保护”某些 url 前缀。您可以创建一个自定义服务器,但它有点高级,并且有缺点,在文档中描述,https://nextjs.org/docs/advanced-features/custom-server

【讨论】:

以上是关于NextJS 应用暂时显示受限路由组件的主要内容,如果未能解决你的问题,请参考以下文章

NextJs - 导出使用样式组件的应用程序时出错

如何在 nextjs 应用程序的导航栏上从左到右添加动画?

如何在 nextjs 的 getInitialProps 无状态组件中访问路由器参数

Nextjs 动态路由与 next-i18next 构建错误

如何使用来自@mui/material 的样式使情感组件选择器在 nextjs 应用程序中工作?

Amazon CloudFront 中的 NextJS 动态路由