簡體   English   中英

getStaticProps 不適用於 Nextjs 中的 getInitialProps

[英]getStaticProps not working with getInitialProps in Nextjs

在我的 _document.js 中,我配置了一些 styles。 這是我的 _document.js

import React from "react";
import Document, {Html ,Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/styles";

class MyDocument extends Document {
  render() {
    return (
      <Html lang="en">
        <Head>
          <meta charSet="utf-8" />
          <meta name="theme-color" content="#000000" />
          <link rel="shortcut icon" href={require("assets/img/favicon.png")} />
          <link
            rel="apple-touch-icon"
            sizes="76x76"
            href={require("assets/img/apple-icon.png")}
          />
          {/* Fonts and icons */}
          <link
            rel="stylesheet"
            type="text/css"
            href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:400,700|Material+Icons"
          />
          <link
            href="https://use.fontawesome.com/releases/v5.0.10/css/all.css"
            rel="stylesheet"
          />
        </Head>
        <body>
          <div id="page-transition"></div>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}
  
MyDocument.getInitialProps = async ctx => {
  // Resolution order
  //
  // On the server:
  // 1. app.getInitialProps
  // 2. page.getInitialProps
  // 3. document.getInitialProps
  // 4. app.render
  // 5. page.render
  // 6. document.render
  //
  // On the server with error:
  // 1. document.getInitialProps
  // 2. app.render
  // 3. page.render
  // 4. document.render
  //
  // On the client
  // 1. app.getInitialProps
  // 2. page.getInitialProps
  // 3. app.render
  // 4. page.render

  // Render app and page and get the context of the page with collected side effects.
  const sheets = new ServerStyleSheets();
  const originalRenderPage = ctx.renderPage;

  ctx.renderPage = () =>
    originalRenderPage({
      enhanceApp: App => props => sheets.collect(<App {...props} />)
    });

  const initialProps = await Document.getInitialProps(ctx);

  return {
    ...initialProps,
    // Styles fragment is rendered after the app and page rendering finish.
    styles: [
      <React.Fragment key="styles">
        {initialProps.styles}
        {sheets.getStyleElement()}
      </React.Fragment>
    ]
  };
};

export default MyDocument;

現在,當我嘗試使用 getStaticProps 從 API 獲取數據時,它給了我一個服務器錯誤,

TypeError: 'Cannot read property of 'data' undefined'

我在 index.js 中的代碼

export const getStaticProps = async () => {
  const res = await fetch("http://localhost:8055/items/gallery2");
  const dataa = await res.json();
  return {
    props: { gallery: dataa },
  };
};

當我嘗試做的時候,

{gallery.data.map(image_url => (
<div>
</div>
))

它給了我下面提到的 typeError 。 我應該怎么做才能讓它開始工作? PS:我在 index.js 中使用 getStaticProps。 我不知道為什么會出現這個錯誤,請幫助我解決這個問題。

謝謝:編輯1:我的控制台錯誤:

Uncaught     at Cardd (file://D:\projects\nextjs-material-kit-master\.next\server\pages\components.js:15365:14)
    at processChild (file://D:\projects\nextjs-material-kit-master\node_modules\react-dom\cjs\react-dom-server.node.development.js:3043:14)
    at resolve (file://D:\projects\nextjs-material-kit-master\node_modules\react-dom\cjs\react-dom-server.node.development.js:2960:5)
    at ReactDOMServerRenderer.render (file://D:\projects\nextjs-material-kit-master\node_modules\react-dom\cjs\react-dom-server.node.development.js:3435:22)
    at ReactDOMServerRenderer.read (file://D:\projects\nextjs-material-kit-master\node_modules\react-dom\cjs\react-dom-server.node.development.js:3373:29)
    at renderToString (file://D:\projects\nextjs-material-kit-master\node_modules\react-dom\cjs\react-dom-server.node.development.js:3988:27)
    at renderPage (file://D:\projects\nextjs-material-kit-master\node_modules\next\dist\next-server\server\render.js:54:851)
    at Object.ctx.renderPage (file://D:\projects\nextjs-material-kit-master\.next\server\pages\_document.js:1629:26)
    at Function.getInitialProps (file://D:\projects\nextjs-material-kit-master\.next\server\pages\_document.js:699:19)
    at Function.module.exports../pages/_document.js.MyDocument.getInitialProps (file://D:\projects\nextjs-material-kit-master\.next\server\pages\_document.js:1640:83)
    at loadGetInitialProps (file://D:\projects\nextjs-material-kit-master\node_modules\next\dist\next-server\lib\utils.js:5:101)
    at renderToHTML (file://D:\projects\nextjs-material-kit-master\node_modules\next\dist\next-server\server\render.js:54:1142)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async (file://D:\projects\nextjs-material-kit-master\node_modules\next\dist\next-server\server\next-server.js:109:97)
    at async __wrapper (file://D:\projects\nextjs-material-kit-master\node_modules\next\dist\lib\coalesced-function.js:1:330)

添加try/catch塊並檢查 api 請求沒有失敗:

export const getStaticProps = async () => {
  let dataa = {data: []};
  try {
    const res = await fetch("http://localhost:8055/items/gallery2");
    dataa = await res.json();
  } catch(err) {
    console.log("request failed: ", err);
  }

  return {
    props: { gallery: dataa },
  };
};

添加“道具”。 或“this.props”。 在畫廊之前並再次測試

{
    props.gallery.data.map(image_url) => {return (
        <div></div>  
    )}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM