首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在盖茨比和GraphQL中通过标签获取相关新闻

问在盖茨比和GraphQL中通过标签获取相关新闻
EN

Stack Overflow用户
提问于 2021-05-28 13:30:47
回答 1查看 222关注 0票数 1

我一直在为GraphQL的文章获取相关的新闻。每一篇文章都有一个或多个标签,基于这些标签,它需要找到最多3篇与新查询相关的文章。

任何帮助都将不胜感激。

我的查询如下:

代码语言:javascript
复制
    strapiArticles(Slug: { eq: $slug }) {
        strapiId
        Title
        Date
        Content
        tags {
            tag
            slug
        }
        Image {
            publicURL
        }
    }
}

标签位看起来如下:

代码语言:javascript
复制
"tags": [
    {
      "tag": "Tag 1",
      "Slug": "tag-1"
    },
    {
      "tag": "Tag 2",
      "Slug": "tag-2"
    }
]

我尝试在上下文中传递标记,但是Gatsby不支持上下文中的数组或对象。如下所示:

代码语言:javascript
复制
createPage({
      path: `news/${edge.node.Slug}`,
      component: path.resolve("src/templates/news-post.js"),
      context: {
        tag: edge.node.tags,
        slug: edge.node.Slug,
      }
    })
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-28 13:50:11

但是Gatsby不支持上下文中的数组或对象。

那是胡说。您可以通过上下文发送一个标记数组,但您需要首先准备数据:

代码语言:javascript
复制
   let allTagsFromNode= edge.node.tags.map(tag=> tag.tag);

这将返回结构(如tag)中特定新结构中的所有标记名( ["Tag 1", "Tag 2"] )。如果需要的话,稍微调整一下,得到一个简单的一维数组。

代码语言:javascript
复制
createPage({
      path: `news/${edge.node.Slug}`,
      component: path.resolve("src/templates/news-post.js"),
      context: {
        allTagsFromNode,
        slug: edge.node.Slug,
      }
    })

注意:因为您用与值相同的键发送allTagsFromNode,所以可以省略通过allTagsFromNode: allTagsFromNode发送它。

然后,在news-post.js模板中,您的查询应该如下所示:

代码语言:javascript
复制
export const newsData = graphql`
    query getNewsInformation ($slug: String!, $author: String, $allTagsFromNode: [String!]) {
        ## your news query
        relatedArticles: strapiArticles(
            filter: {
              tags: {elemMatch: {tag: {in: $allTagsFromNode}}}, 
              Slug: {ne: $slug}},
            limit: 3) {
            edges {
                node {
                  ## your node fields
                }
            }
        }
    }
`;

在调整查询以适应您的需要(因为我不知道您的数据结构是什么样子)和添加新闻查询的同时,重要的是您要通过$allTagsFromNode发送标记,该数组声明为字符串的数组(称为GraphQL中的列表):

代码语言:javascript
复制
$allTagsFromNode: [String!]

现在,您可以从所有文章中查询和筛选相关新闻:

代码语言:javascript
复制
relatedArticles: strapiArticles(
    filter: {
       tags: {elemMatch: {tag: {in: $allTagsFromNode}}}, 
       Slug: {ne: $slug}},
    limit: 3)

现在,您正在过滤包括在tag列表中的所有标记名称( allTagsFromNode )。

同样重要的是要注意,您不希望将同一篇文章包含为相关的文章,这就是为什么您要在Slug: {ne: $slug}}中省略它(使用ne过滤器)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67739815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档