如何在不更改当前 URL 的情况下显示错误页面

Posted

技术标签:

【中文标题】如何在不更改当前 URL 的情况下显示错误页面【英文标题】:How to show error page without changing current URL 【发布时间】:2022-01-08 17:13:54 【问题描述】:

我有一个名为 500.tsx 的自定义 500 错误页面,我希望能够在来自客户端的请求失败且状态为 500 时显示此页面,但将客户端保留在旧 url 上(例如 /auth/register)。我有一个axios 错误侦听器,它应该可以完成所有工作。但是找不到使用next/router 的方法。任何帮助表示赞赏

【问题讨论】:

我可以给你一点提示,比如当你收到错误时,创建一个像 enableErrorPage 这样的全局布尔标志,然后在所有现有页面中使用这个标志来导入/包含你的500.tsx 组件。如果enableErrorPage == true 渲染500.tsx 这听起来像是工作建议,但不会被视为不好的做法吗? 因此,为了更好的方式,您也可以在路由的 JSON 中执行此逻辑,但您只需要变通并使其集中。 实际上并没有得到你的意思 【参考方案1】:

起初没有意识到 OP 想要显示 500 页。

您可以查看router.isFallback,但我不完全确定这是否适合。 它应该用于页面加载指示器,但在你的情况下,由于页面永远不会加载,它可以工作。

https://nextjs.org/docs/basic-features/data-fetching#fallback-true

 return router?.isFallback 
   ? <Custom500Page/>
   : <RegularPage/>

您可以通过getStaticPaths 方法设置此变量,该方法在构建期间运行,通常用于[slug] 页面。

// This function gets called at build time
export async function getStaticPaths() 
  // Fetch paths to your slug pages here

  return 
    // paths,
    fallback: true
  

显示 404 页面非常简单,我们就是这样做的。

渲染 404 页面

您可以从getStaticProps 方法有条件地将名为notFound 的变量导出为true。

如果 URL 无效并且您没有数据来呈现页面,您只需将该 notFound 属性作为 true 传递,然后默认或自定义 404 页面将自动显示并保留您的无效 URL。

// This function gets called at build time
export async function getStaticProps( params, preview = false ) 
  let pageData

  try 
    // fetch pageData from API here
   catch (error) 
    // catch errors
  

  // check validity or emptyness of data
  // invalid URL (slug) -> empty data from API
  // valid URL (slug) -> valid data from API

  return isObjectEmpty(pageData)
    ?  notFound: true 
    : 
        props: 
          pageData
          // pass other props to the page
        
      

getStaticPropsnot-found 上的 NextJS 文档

https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation

【讨论】:

如果客户端请求失败怎么办?我想在 axios 捕获 500 状态错误时显示 500 页 请原谅我草率下结论。我重新阅读了这个问题并相应地调整了我的答案。

以上是关于如何在不更改当前 URL 的情况下显示错误页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改 Vue 中的 url 的情况下返回 404 错误?

如何在不重新加载页面的情况下更改页面 url

如何在不重新加载页面的情况下更改 URL?

如何在不刷新页面的情况下显示错误?

如何在不更改页面的情况下上传文件

如何在不更改当前 URL 的情况下打开新窗口?