Next.JS: 如何处理getInitialProps 中的错误?
Next.JS: How to handle error in getInitialProps?
我想从 API 获取数据,如果失败,我希望它呈现 _error.js
页面。我的请求取决于路由器查询。因此,如果用户输入错误的查询,页面将抛出错误。
如果请求因抛出而失败,我希望显示我的自定义_error.js
。
如何实现?
这是我的索引页:
// pages/index.js
import React from 'react'
import PropTypes from 'prop-types'
import fetch from 'isomorphic-unfetch'
import Items from '../components/Items'
import { API } from '../utils/config'
const IndexPage = ({ items }) => {
return (
<div>
<Items items={items} />
</div>
)
}
IndexPage.getInitialProps = async (context) => {
const { query } = context
const filter = query.filter || ''
const name = query.name || ''
const page = query.page || 1
const response = await fetch(
`${API}?${filter}=${name}&page=${page}`,
)
const data = await response.json()
return {
items: data.items,
}
}
export default IndexPage
我的 _app 文件:
// pages/_app.js
import React from 'react'
import Router from 'next/router'
import Page from '../components/Page'
const MyApp = (props) => {
const { Component, pageProps } = props
return (
<Page>
<Component
items={pageProps.items}
query={pageProps.query}
statusCode={pageProps.statusCode}
/>
</Page>
)
}
export default MyApp
尝试根据错误进行条件渲染,因此如果发生错误,请将 items
设置为 null
const IndexPage = ({ items }) => {
return (
{items===null ? <Fragment>
<ErrorPage />
</Fragment> : <div>
<Items items={items} />
</div> }
)
}
并在 getInitialProps
IndexPage.getInitialProps = async (context) => {
try{
const { query } = context
const filter = query.filter || ''
const name = query.name || ''
const page = query.page || 1
const response = await fetch(
`${API}?${filter}=${name}&page=${page}`,
)
const data = await response.json()
return {
items: data.items,
}
}catch(error){
return {
items: null
}
}
}
我想从 API 获取数据,如果失败,我希望它呈现 _error.js
页面。我的请求取决于路由器查询。因此,如果用户输入错误的查询,页面将抛出错误。
如果请求因抛出而失败,我希望显示我的自定义_error.js
。
如何实现?
这是我的索引页:
// pages/index.js
import React from 'react'
import PropTypes from 'prop-types'
import fetch from 'isomorphic-unfetch'
import Items from '../components/Items'
import { API } from '../utils/config'
const IndexPage = ({ items }) => {
return (
<div>
<Items items={items} />
</div>
)
}
IndexPage.getInitialProps = async (context) => {
const { query } = context
const filter = query.filter || ''
const name = query.name || ''
const page = query.page || 1
const response = await fetch(
`${API}?${filter}=${name}&page=${page}`,
)
const data = await response.json()
return {
items: data.items,
}
}
export default IndexPage
我的 _app 文件:
// pages/_app.js
import React from 'react'
import Router from 'next/router'
import Page from '../components/Page'
const MyApp = (props) => {
const { Component, pageProps } = props
return (
<Page>
<Component
items={pageProps.items}
query={pageProps.query}
statusCode={pageProps.statusCode}
/>
</Page>
)
}
export default MyApp
尝试根据错误进行条件渲染,因此如果发生错误,请将 items
设置为 null
const IndexPage = ({ items }) => {
return (
{items===null ? <Fragment>
<ErrorPage />
</Fragment> : <div>
<Items items={items} />
</div> }
)
}
并在 getInitialProps
IndexPage.getInitialProps = async (context) => {
try{
const { query } = context
const filter = query.filter || ''
const name = query.name || ''
const page = query.page || 1
const response = await fetch(
`${API}?${filter}=${name}&page=${page}`,
)
const data = await response.json()
return {
items: data.items,
}
}catch(error){
return {
items: null
}
}
}