NextJS 处理“服务器错误”和“客户端错误”的最佳实践

NextJS best practice for handling "Server Error" and "Client side error"

提问人:Akber Iqbal 提问时间:10/29/2020 更新时间:11/17/2023 访问量:17516

问:

使用 NextJS,我看到 2 种错误:

服务器错误

  • 使用 inside getInitialProps 生成它...throw new Error(...)
  • 它可能是由于某些业务逻辑或意外的 API 响应而发生的;
  • 截图:

Server error

未处理的运行时错误

  • 使用组件内部生成它throw new Error(...)
  • 它可能由于某些业务逻辑而发生;
  • 此处的错误由 ErrorBoundary 捕获(该边界在_app.js)
  • 截图:

Unhandled Runtime Error

问题: 未处理的运行时错误在 Error Boundary 中被捕获(就像在 ReactJS 中一样)......如何最好地处理“服务器错误”...最佳实践是什么?

reactjs 处理 next.js 服务器错误

评论

2赞 Gh05d 1/8/2021
你在这里是否取得了任何进展,或者可以分享任何关于如何最好地处理错误的资源?我对框架的行为感到困惑。
1赞 Akber Iqbal 1/8/2021
在每次 API 调用中尝试捕获块...尝试测试每个输入到 getInitialProps 或 getStaticProps 以处理 null、error 和 exception 值;这些编码实践(尽管非常基础)是获得可靠工作应用程序的重要基本步骤

答:

0赞 Pablopvsky 4/7/2021 #1

处理错误的最佳实践之一是使用 Early Return,方法是在 getInitialProps 中返回一个 prop,并在呈现页面后使用它来呈现错误页面,以防止处理页面内可能出现的错误。statusCodestatusCode

  • 如果一切正常,200
  • 如果不存在 404
  • 如果服务器错误 503
import Error from "next/error"

function Page({ stars, statusCode}) {
  
  if(statusCode !== 200) {
    return <Error statusCode={statusCode} />
  }
  
  return <div>Next stars: {stars}</div>
}

Page.getInitialProps = async (ctx) => {
  
  try{
    const res = await fetch('https://api.github.com/repos/vercel/next.js')
    const json = await res.json()
    
    if(res.status >= 400){
      return { stars: json.stargazers_count, statusCode: res.status }
    }
    
    return { stars: json.stargazers_count, statusCode: 200 }
   
    
  } catch(error){
    
    return {stars: null, statusCode: 503}
  }
  
}

export default Page