Как написать правильный запрос GraphQL для извлечения / фильтрации «тегов» из ghost CMS в gatsby? - PullRequest
0 голосов
/ 25 июня 2019

Моя цель - отфильтровать сообщения в Gatsby из Ghost CMS с помощью запроса GraphQL с тегом "haka".

Пример gatsbyghost :

{
  allGhostPost(filter: {tags: {elemMatch: {slug: {eq: $slug}}}}) {
    edges {
      node {
        slug
        ...
      }
    }
  }
}

Я применил свой запрос к файлу gatsby-node.js следующим образом:

const path = require(`path`)
const config = require(`./src/utils/siteConfig`)
const { paginate } = require(`gatsby-awesome-pagination`)

/**
* Here is the place where Gatsby creates the URLs for all the
* posts, tags, pages and authors that we fetched from the Ghost site.
*/
exports.createPages = ({ graphql, actions }) => {
    const { createPage } = actions

    /**
    * Posts
    */
    const createPosts = new Promise((resolve, reject) => {
        const postTemplate = path.resolve(`./src/templates/post.js`)
        const indexTemplate = path.resolve(`./src/templates/index.js`)
        resolve(
            graphql(`
                {
                    allGhostPost(filter: {tags: {elemMatch: {slug: {eq: "haka"}}}}) (
                        sort: {order: ASC, fields: published_at}
                    ) {
                        edges {
                            node {
                                slug
                            }
                        }
                    }
                }`
            ).then((result) => {
                if (result.errors) {
                    return reject(result.errors)
                }

Он приходитс ошибкой:

Предупреждение: React.createElement: тип недействителен - ожидается строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: undefined.Вероятно, вы забыли экспортировать свой компонент из файла, в котором он определен, или вы перепутали импорт по умолчанию и имена.

Проверьте метод рендеринга PageRenderer.

СделалЯ поставил код в неправильном месте?Или я неправильно отформатировал?Или мне нужно обновить другие файлы для выполнения запроса?

1 Ответ

0 голосов
/ 26 июня 2019

Аааа, когда я прокомментировал ранее, я пропустил синтаксическую ошибку в запросе graphql. Попытаетесь ли вы исправить это, чтобы увидеть, является ли это причиной проблемы?

  {
    // remove this line
-   allGhostPost(filter: {tags: {elemMatch: {slug: {eq: "haka"}}}}) (

    // add this 2 lines instead
+   allGhostPost(
+     filter: {tags: {elemMatch: {slug: {eq: "haka"}}}},
      sort: {order: ASC, fields: published_at}
    ) {
      edges {
        node {
          slug
        }
      }
    }
  }

При передаче нескольких аргументов их можно разделить запятой:

query {
  allGhostPost(filter: ... , sort: ....) { ... }
}

Кроме того, теперь, когда я вижу полный код, вам определенно следует удалить внешнюю resolve:

const createPosts = new Promise((resolve, reject) => {
    const postTemplate = path.resolve(`./src/templates/post.js`)
    const indexTemplate = path.resolve(`./src/templates/index.js`)
-   resolve(   
       ...
-   )
})

Мало того, что это не нужно, возможно, оно также скрывает синтаксическую ошибку, которую выдает graphql, что приводит к вводящему в заблуждение сообщению об ошибке.

...