You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取指定对象的边及单查询实现Post上下篇导航的技术问询

问题解答

1. 获取给定对象的边

在GraphQL的Connection模式里,边(Edge)一般包含cursor(游标)和对应的node(节点对象)。要拿到特定对象的边,核心思路是先精准定位目标对象,再请求它所在连接的edges字段就行。举个实际例子,假设你要找ID为指定值的Post对应的边,可以这么写查询:

query GetTargetPostEdge($targetPostId: ID!) {
  allPosts(filter: { id: $targetPostId }) {
    edges {
      cursor # 边的游标信息
      node {
        id
        title
        createdAt
        content
      }
    }
  }
}

这里通过filter匹配目标Post的ID,然后从edges里提取对应的边数据。当然具体的筛选字段、连接名称要和你的实际Schema对应,核心逻辑是通用的。

2. 单个查询获取当前Post的上一篇和下一篇

你之前尝试同时用after和before确实走不通,因为GraphQL Connection规范里这两个参数是互斥的。要实现上下篇导航,我们可以用查询别名把两个独立的筛选查询合并成一个请求,一次拿到结果。

假设你的Post是按createdAt(发布时间)排序来区分上下篇,查询可以这么写:

query GetPrevNextPosts($currentId: ID!, $currentCreatedAt: DateTime!) {
  # 下一篇:比当前Post发布时间晚的第一个,排除当前Post本身
  nextPost: allPosts(
    first: 1
    filter: {
      createdAt: { gt: $currentCreatedAt }
      id: { ne: $currentId }
    }
    orderBy: createdAt_ASC
  ) {
    id
    title
  }
  
  # 上一篇:比当前Post发布时间早的最后一个,排除当前Post本身
  prevPost: allPosts(
    last: 1
    filter: {
      createdAt: { lt: $currentCreatedAt }
      id: { ne: $currentId }
    }
    orderBy: createdAt_ASC
  ) {
    id
    title
  }
}

逻辑说明:

  • 用nextPost和prevPost作为别名,把两个查询结果合并在一个响应里,实现“单个查询”的需求
  • 通过createdAt的gt(大于)和lt(小于)筛选出时间前后的Post
  • 加上id: { ne: $currentId }避免拿到当前Post本身
  • 前端拿到结果后,如果prevPost为空就隐藏上一篇箭头,nextPost为空就隐藏下一篇箭头,刚好适配导航功能

如果你的排序规则不是createdAt(比如按更新时间updatedAt),只需要把createdAt换成对应的字段就行,逻辑完全通用。

内容的提问来源于stack exchange,提问作者Patrick.SE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:24:02