Graphql 基于 offset 的分页查询

发布于 2023-07-06 23:19:51 字数 1688 浏览 38 评论 0

Server 端

graphql schema 定义:

type Post {
  id: Int
  body: String
  published: Boolean
  title: String
}

type PageInfo {
    page: Int
    limit: Int
}

type PostsResult {
    totalCount: Int
    edges: [Post]
    pageInfo: PageInfo
}

type Query {
  posts(page: Int, limit: Int): PostsResult
}

resolvers 定义,基于 nodejs :

'use strict'
const Fastify = require('fastify')
const mercurius = require('mercurius')
const { PrismaClient } = require('@prisma/client')

const app = Fastify()
const prisma = new PrismaClient()

const schema = `
type Post {
  id: Int
  body: String
  published: Boolean
  title: String
}

type PageInfo {
    page: Int
    limit: Int
}

type PostsResult {
    totalCount: Int
    edges: [Post]
    pageInfo: PageInfo
}

type Query {
  posts(page: Int, limit: Int): PostsResult
}
`

const resolvers = {
    Query: {
        posts: async (_parent, args, ctx) => {
            const page = args.page ?? 1;
            const limit = args.limit == null || args.limit > 100 || args.limit <= 0 ? 10: args.limit;
            const total = await ctx.prisma.post.count();
            const posts = await ctx.prisma.post.findMany({
                skip: (page - 1) * limit,
                take: limit,
            });
            return {
                totalCount: total,
                edges: posts,
                pageInfo: {
                    page,
                    limit,
                }
            };
        },
    },
}

app.register(mercurius, {
    schema,
    resolvers,
    context: (request, reply) => {
        return {prisma}
    }
})


app.listen({port: 3000}).then(() => {
    console.log(`

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

一抹苦笑

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文