在 Gatsby 和 Contentful 中按日期过滤

Posted

技术标签:

【中文标题】在 Gatsby 和 Contentful 中按日期过滤【英文标题】:Filtering by dates in Gatsby and Contentful 【发布时间】:2019-07-13 22:25:29 【问题描述】:

如何在 Gatsby 中按日期过滤?文档提到了 ltgt 运算符,当我尝试使用它们时会出错。

【问题讨论】:

【参考方案1】:

在 Gatsby 中按日期过滤可能很棘手。许多 API 以字符串形式以 JSON 格式发送日期 - ISO8601 格式。这意味着 GraphQL 也会将日期视为字符串。如果您乐于过滤字符串相等性,这很好,但这通常不是您想要过滤日期的方式。

一个常见的用例是过滤到过去或未来的日期。在大多数情况下,我们会与今天的日期进行某种less thanmore than 比较。不幸的是,这不适用于 GraphQL 中的日期字符串。 ltgt 运算符仅适用于 数字,不适用于字符串。

幸运的是,有一个逃生舱口 - setFieldsOnGraphQLNodeType。这允许我们获取一个内容节点,并添加我们自己的带有派生数据的字段。我们可以获取一个日期字符串,并将其解析为一个时间戳 - 一个数字。使用日期作为时间戳,graphql 可以做它的事情并允许ltgt 过滤器。

假设我们正在写博客,以及过滤过去发布的帖子的内容。我们可以在 ContentModel 中添加 publishedAt 日期时间字段,这将有助于我们的内容作者将来发布内容。我们可以过滤掉未来的帖子,直到我们将 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 这是一个数字,这意味着您现在可以使用 ltgt 对其进行过滤

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

【讨论】:

非常好,您也可以在onCreateNode 钩子中执行此操作(see this question)。我喜欢setFieldsOnGraphQLNodeType,你可以指定字段的类型。

以上是关于在 Gatsby 和 Contentful 中按日期过滤的主要内容,如果未能解决你的问题,请参考以下文章

将 Gatsby + Contentful 网站部署到 Netlify

Gatsby Contentful-GraphQL查询错误:未知类型“ ContentfulFixed”

使用 Gatsby/Contentful 从 Graphql 获取参考数据

使用 gatsby-source-contentful 访问您的内容空间失败

Gatsby + Contentful - 如何在不重新启动服务器的情况下在本地重做 GraphQL 查询(npm run dev)?

Gatsby Contentful - GraphQL 查询错误:未知类型“ContentfulFixed”