gpt4 book ai didi

graphql - 在 Gatsby 和 Contentful 中按日期过滤

转载 作者:行者123 更新时间:2023-12-04 01:47:56 31 4
gpt4 key购买 nike

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

最佳答案

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

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

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

假设我们正在写一个博客,以及过滤过去发布的帖子的内容。我们可以添加一个 publishedAt我们 ContentModel 中的 datetime 字段,这将有助于我们的内容作者将来发布内容。我们可以过滤掉 future 的帖子,直到我们转换 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
}
}
}
}

关于graphql - 在 Gatsby 和 Contentful 中按日期过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782808/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com