目前,我正在关注如何在getInitialProps
中重定向用户的示例https://github.com/zeit/next.js/wiki/Redirecting-in-%60getInitialProps%60
问题是,如果我想像这样返回404,它将返回一个空白页而不是通常的Next.js 404错误页面。
context.res.writeHead(404)
context.res.end();
请注意我知道使用ExpressJs并使用状态代码404工作,但是,对于这个项目,我不允许使用ExpressJs所以我需要使用典型的nodejs writeHead来完成它。
答案 0 :(得分:5)
下一个 v10 允许返回 404 页面(不带道具,但就像下面一样简单)
if (!checkItem) {
return {
notFound: true
}
}
对我有用的完整代码:✅✅✅
export const getServerSideProps = wrapper.getServerSideProps(async ({ req, res, locale, query, store }) => {
const { productId, categoryId } = query
const checkItem = await getProductBySlugSSR(productId, categoryId, store)
if (!checkItem) {
return { // <-----------------does the trick here!!
notFound: true
}
}
return {
props: {
...await serverSideTranslations(locale, ['common']),
}
}
})
文档:this comment
答案 1 :(得分:3)
为此,您必须在页面中呈现错误页面。
您可以这样做:
import React from 'react'
import ErrorPage from 'next/error'
class HomePage extends React.Component {
static async getInitialProps(context) {
try {
const data = await retrieveSomeData()
return { data }
} catch (err) {
// Assuming that `err` has a `status` property with the HTTP status code.
if (context.res) {
context.res.writeHead(err.status)
}
return { err: { statusCode: err.status } }
}
}
render() {
const { err, data } = this.props
if (err) {
return <ErrorPage statusCode={err.statusCode} />
}
/*
* return <Something data={data} />
*/
}
}
如果您有自定义错误页面,则必须导入自定义next/error
页面,而不是导入_error
。
答案 2 :(得分:1)
按照以下方式实现getInitialProps:
static async getInitialProps(context) {
const {res} = context;
...
if ([something went wrong]) {
if (res) {
res.statusCode = 404;
}
return {
err: {
statusCode: 404
},
};
}
...
然后在render()中检查err
是否处于状态定义,在这种情况下,返回ErrorPage(默认或自定义,取决于您的实现),仅此而已! err中的statusCode仅用于ErrorPage上的更详细的消息,因此需要将其作为道具传递。
答案 3 :(得分:0)
import App, { Container } from 'next/app'
import React from 'react'
import Head from 'next/head'
import * as Sentry from '@sentry/node'
import Error from './_error'
require('es6-promise').polyfill()
require('isomorphic-fetch')
class MyApp extends App {
static async getInitialProps({ Component, ctx }) {
let pageProps = {}
let e
if (Component.getInitialProps) {
try {
pageProps = await Component.getInitialProps(ctx)
} catch (error) {
e = error
Sentry.captureException(error) //report to sentry
}
}
return { pageProps, e }
}
render() {
const { Component, pageProps, e } = this.props
if (e) {
return <Error /> // customize your error page
}
return (
<Container>
<Head>
<title> Your title</title>
</Head>
<Component {...pageProps} />
</Container>
)
}
}
export default MyApp
这就像一个魅力〜 只需尝试在next / app中捕获,然后就可以在所有页面上使用
答案 4 :(得分:0)
如果您只需像在 cra
中那样执行 404 PAGE提供的代码可能会有所帮助: 例如。
import AComponent from '../acomponent';
import Error from '../error';
const User = (data) => {
return data.id ? <AComponent /> : <Error />
}
User.getInitialProps = async (ctx) => {
const res = await fetch(...data) // list of items = []
const data = await res.json()
return data;
}