Next.js返回getInitialProps中的404错误页面

时间:2017-12-01 04:08:19

标签: javascript node.js serverside-javascript next.js nextjs

目前,我正在关注如何在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来完成它。

5 个答案:

答案 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;
 }