Проблема с запросом GraphQl - PullRequest
       50

Проблема с запросом GraphQl

0 голосов
/ 12 апреля 2020

Я использую этот стартер для создания моего блога. По умолчанию вы должны получить доступ к странице статьи по адресу: http://localhost:3000/article?id=1, я также хотел бы это: http://localhost:3000/article?slug=myslug.

мой контроллер статьи выглядит следующим образом:

module.exports = {
  async findOne(ctx) {
    //check if the params id is an id or a slug
    const { id } = ctx.params;

    // if you use MongoDB database
    // we are validating that the id match ObjectID format
    if (id.match(/^[0-9a-fA-F]{24}$/)) {
      const entity = await strapi.services.article.findOne(ctx.params);
      return sanitizeEntity(entity, { model: strapi.models.article });
    }

    // findOne function works only with IDs
    // so we find all and get first entry by using slug
    const [entity] = await strapi.services.article.find({ slug: id });
    return sanitizeEntity(entity, { model: strapi.models.article });
  }
};

маршруты конфигурации статьи являются:

...
    {
      "method": "GET",
      "path": "/articles/:id",
      "handler": "article.findOne",
      "config": {
        "policies": []
      }
    },
    {
      "method": "GET",
      "path": "/articles/:slug",
      "handler": "article.findOne",
      "config": {
        "policies": []
      }
    },
...

, если я делаю http://localhost:1337/articles?id=1 или http://localhost:1337/articles?slug=this-is-my-title, я получаю содержимое обратно, как ожидалось.

Однако, когда я нажимаю http://localhost:3000/article?slug=this-is-my-title, я получаю следующее:

enter image description here

внутри папки страниц (интерфейс, созданный с помощью Next. js) У меня есть pages/article:

const Article = () => {
  const router = useRouter();
  const { data, loading, error } = useQuery(ARTICLE_QUERY, {
    variables: { slug: router.query.slug }
  });
  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {JSON.stringify(error)}</p>;

  return (
    <Layout>
      {console.log(data)}
    </Layout>
  );
};

и ARTICLE_QUERY:

const ARTICLE_QUERY = gql`
  query Articles($slug: String!) {
    article(slug: $slug) {
      id
      title
      content
      image {
        url
      }
      category {
        id
        name
      }
      published_at
    }
  }
`;

Нужна ли какая-либо дополнительная конфигурация, чтобы это исправить?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Ошибка возникает из-за более строгой проверки типов

article запрос требует параметр ID!, при условии, что slug (строка) не удовлетворяет этому требованию.

Вам необходимо укажите отдельный запрос (и распознаватель), например articleBySlug для соответствующего параметра типа строки URL.

Вам также необходимо проверить тип аргумента url в некотором родительском компоненте, чтобы использовать правильный запрос (отобразить различные подкомпоненты).

0 голосов
/ 13 апреля 2020

После небольшого исследования я нашел это решение, которое, учитывая, что у меня нет большого опыта работы с GraphQl, я не уверен, что оно правильное:

const ARTICLE_QUERY = gql`
  query Articles($slug: String!) {
    articles(where:{slug: $slug}) {
      id
      title
      content
      slug
      image {
        url
      }
      category {
        id
        name
      }
      published_at
    }
  }
`;
...