Graphql 在《盖茨比》和《知足》中按日期过滤

Graphql 在《盖茨比》和《知足》中按日期过滤,graphql,gatsby,contentful,Graphql,Gatsby,Contentful,在盖茨比,你怎么能按日期过滤?这些文档暗指lt和gt运算符,我尝试使用它们时会出错。在《盖茨比》中按日期过滤可能很棘手。许多API都将JSON中的日期作为字符串发送——采用ISO8601格式。这意味着GraphQL也会将日期视为字符串。如果您乐于对字符串相等进行过滤,那么这很好,但这通常不是您希望对日期进行过滤的方式 一个常见的用例是过滤过去或将来的日期。在大多数情况下,我们会与今天的日期进行某种小于或大于的比较。不幸的是,这对GraphQL中的日期字符串不起作用。lt和gt运算符仅适用于数字,

在盖茨比,你怎么能按日期过滤?这些文档暗指
lt
gt
运算符,我尝试使用它们时会出错。

在《盖茨比》中按日期过滤可能很棘手。许多API都将JSON中的日期作为字符串发送——采用ISO8601格式。这意味着GraphQL也会将日期视为字符串。如果您乐于对字符串相等进行过滤,那么这很好,但这通常不是您希望对日期进行过滤的方式

一个常见的用例是过滤过去或将来的日期。在大多数情况下,我们会与今天的日期进行某种
小于
大于
的比较。不幸的是,这对GraphQL中的日期字符串不起作用。
lt
gt
运算符仅适用于数字,不适用于字符串

幸运的是,有一个逃生舱-
setFieldsOnGraphQLNodeType
。这允许我们获取一个内容节点,并在其中添加我们自己的字段和派生数据。我们可以获取一个datestring,并将其解析为一个时间戳——一个数字。使用日期作为时间戳,graphql可以完成它的工作并允许
lt
gt
过滤器

假设我们正在写博客,过滤过去发表的帖子。我们可以在ContentModel中添加一个
publishedAt
datetime字段,这将有助于我们的内容作者将来发布内容。我们可以过滤掉未来的帖子,直到我们将日期字符串转换成数字

这看起来是这样的:

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
        }
      }
    }
  }

非常好,您也可以在
onCreateNode
hook()中执行此操作。我喜欢使用
setFieldsOnGraphQLNodeType
可以指定字段的类型。