Фильтрация по датам в Gatsby и Contentful - PullRequest
0 голосов
/ 20 февраля 2019

Как вы можете фильтровать по датам в Гэтсби?В документах упоминаются операторы lt и gt, при попытке их использовать я получаю ошибки.

1 Ответ

0 голосов
/ 20 февраля 2019

Фильтрация по дате в Гэтсби потенциально сложна.Многие даты отправки API в JSON в виде строк - в формате ISO8601.Это означает, что GraphQL будет также рассматривать даты как строки.Это хорошо, если вы довольны фильтрацией на равенство строк, но обычно вы не фильтруете по датам.

Обычный вариант использования - фильтрация по датам в прошлом или будущем.В большинстве случаев мы бы сравнивали с текущей датой less than или more than.К сожалению, это не будет работать для строк дат в GraphQL.Операторы lt и gt применяются только к числам и не работают для строк.

К счастью, есть аварийный люк - setFieldsOnGraphQLNodeType.Это позволяет нам взять узел содержимого и добавить собственные поля с производными данными. Мы можем взять строку даты и проанализировать ее в метку времени - число.С датой в качестве временной метки graphql может делать свое дело и разрешать фильтры lt и gt.

Допустим, мы пишем блог и что фильтровать сообщения, опубликованные в прошлом.Мы можем добавить поле publishedAt datetime в нашу ContentModel, которое поможет нашим авторам контента публиковать вещи в будущем.Мы можем отфильтровать будущие записи, пока не преобразуем publishedAt из строки даты в число.

Вот как это выглядит:

exports.setFieldsOnGraphQLNodeType = ({ type }) => {
  if (type.name === `ContentfulBlogPost`) {
    return {
      publishAtTimestamp: {
        type: GraphQLFloat,
        resolve: source => {
          return new Date(source.publishAt).getTime(); 
        }
     }
   };
  }

  // by default return empty object
  return {};
};

У ContentfulBlogPost теперь есть новое поле publishedAtTimestamp, которое является числом, что означает, что теперь вы можете фильтровать его с помощью lt или gt

  query {
    allContentfulBlogPost(
      filter: { publishedAtTimestamp: { lt: $SOME_TIMESTAMP } }
    ) {
      edges {
        node {
          id
          ...otherFields
        }
      }
    }
  }
...