Как установить данные из стороннего api как siteMetaData в Gatsby? - PullRequest
0 голосов
/ 01 марта 2020

Я хочу установить локали из Contentful как siteMetaData в Gatsby, но я думаю, что мы не можем запускать такие методы в gatsby-config. js во время сборки?

const contentful = require("contentful")

const client = contentful.createClient({
  space: "my_space_id",
  accessToken: "my_access_token",
})

let defaultLocale = {}

// Get locales from Contentful
client.getLocales()
  .then(data =>
    data.items.forEach(item => {
      if (item.default) {
        Object.assign(defaultLocale, item)
      }
    })
  )
  .catch(err => console.log(err))

module.exports = {
  siteMetadata: {
    title: `My site`,

    // Put locale into siteMetaData.
    defaultLocale,
  },
...
}

Работает с develop но build терпит неудачу:

error There was an error in your GraphQL query:
Cannot query field "defaultLocale" on type "SiteSiteMetadata".

Я прочитал gatsby-config. js документы и гуглил. Я думал об использовании gatsby- node.js, но это не представляется возможным, или, может быть, я недостаточно знаком с ним.

Обновление 2 марта 2020 : я также пытался получить данные прямо внутри siteMetadata в gatsby-config. js:

{
    siteMetadata: {
        defaultLocale: () => {
                // Get and return data from Contentful
            }
  },

Я получил ту же ошибку, что и раньше.

Затем я попытался вывести все конфиги и запустить async / await в module.exports в gatsby-config. js для получения содержательных данных перед их возвратом:

let config = {
    siteMetadata: {
        ...
  },
  plugins: [...]
  }
}

module.exports = async () => {
    let data = await client.getLocales()
    let defaultLocale = // Get the locale data.
    config.siteMetadata["defaultLocale"] = defaultLocale
    return config
}

gatsby build жалуется: A gatsby-config exported as a Function can only be used as a theme and not run directly.

Обновление 3 марта 2020 года . Самое близкое, что я получил, это API-интерфейс Gatsby setFieldsOnGraphQLNodeType . Я закодировал это в gatsby- node.js:

exports.setFieldsOnGraphQLNodeType = ({ type }) => {
  if (type.name === `Site`) {

    return {
      defaultLocale: {
        type: GraphQLString,
        args: {},
        resolve: (source, fieldArgs) => {
          return `Test lang.`
        },
      },
    }
  }
  return {}
}

На площадке Graphql я могу использовать этот запрос:

query MyQuery {
  site {
    siteMetadata {
      title
    }
    defaultLocale
  }
}

Чтобы получить это:

{
  "data": {
    "site": {
      "siteMetadata": {
        "title": "My website"
      },
      "defaultLocale": "Test lang."
    }
  }
}

Однако я не могу понять, как это сделать, чтобы defaultLocale вкладывалось в siteMetadata, а не в верхний уровень в site. Так близко!

Если это помогает, форма type выглядит следующим образом:

{
  name: 'Site',
  nodes: [
    {
      siteMetadata: [Object],
      port: 8000,
      host: '0.0.0.0',
      ...
    }
  ]
}

Как вы устанавливаете данные из сторонних API в siteMetaData?

...