【问题标题】:How do I call a Prismic API inside next.js getInitialProps?如何在 next.js getInitialProps 中调用 Prismic API?
【发布时间】:2018-03-05 03:58:03
【问题描述】:

如何从next.js application 调用Prismic (CMS) API?在next.js我之前有过:

import React from 'react'
import Link from 'next/link'
import 'isomorphic-fetch'

export default class Index extends React.Component {
  static async getInitialProps () {
    const res = await fetch('https://myAPI_URL')
    const json = await res.json()
    return { cars: json.results }
  }

  render () {
    return (
      <div>
        <p>I can see the data {this.props.cars} </p>
      </div>
    )
  }
}

但我想使用 Prismic 开发套件作为依赖项,如 in their documentation. 所述

npm install prismic-javascript prismic-dom --save

以及调用 Prismic 的代码:

const Prismic = require('prismic-javascript');

const apiEndpoint = "https://your-repository-name.prismic.io/api/v2";
const apiToken = "this_is_a_fake_token_M1NrQUFDWUE0RYvQnvv70";

Prismic.getApi(apiEndpoint, {accessToken: apiToken}).then(function(api) {
  return api.query(""); // An empty query will return all the documents
}).then(function(response) {
  console.log("Documents: ", response.results);
}, function(err) {
  console.log("Something went wrong: ", err);
});

但是如何让 Prismic API 调用在 getInitialProps 中与 next.js 一起工作?例如:

import React from 'react'
import Link from 'next/link'
import 'isomorphic-fetch'

export default class Index extends React.Component {
  static async getInitialProps () {
    // fetch Prismic API and return the results
  }

  render () {
    return (
      <div>
        <p>Showing data fetched from API here</p>
      </div>
    )
  }
}

【问题讨论】:

    标签: javascript reactjs next.js prismic.io


    【解决方案1】:

    您已经准备好所有组件。代替fetch,等待Prismic 请求。然后返回结果。

    import React from 'react';
    import Prismic from 'prismic-javascript';
    
    const apiEndpoint = 'https://project.prismic.io/api/v2';
    const apiToken = 'TOKEN';
    
    export default class Index extends React.Component {
      static async getInitialProps({ req, query }) {
        const data = await Prismic.getApi(apiEndpoint, { accessToken: apiToken })
          .then(api => {
            return api.query(''); // An empty query will return all the documents
          })
          .catch(err => console.log(err));
    
        return { cars: data.results };
      }
    
      render() {
        return <div>Example car id: {this.props.cars[0].id}</div>;
      }
    }
    

    【讨论】:

    • @Fabian Schultz 如何处理多个承诺?这种情况下如何应用 Promise.all()?
    • @vizFlux 您可以将 Promise 放入多个函数中,然后将其传递给一个 Promise.all。查看some other questions about that,或询问新的:)
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 2019-01-29
    • 2019-10-04
    • 2020-06-22
    • 1970-01-01
    • 2018-09-30
    • 2019-03-01
    • 2017-11-29
    相关资源
    最近更新 更多