Я хочу установить локали из 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?