美文网首页
GraphQL入门之分页查询

GraphQL入门之分页查询

作者: kongxx | 来源:发表于2024-03-18 08:45 被阅读0次

前一篇文章讲了怎么创建 GraphQL 的查询操作,今天在此基础上看看要实现一个简单的分页查询应该怎么做,顺便可以介绍一下 GraphQL 里的枚举类型和查询参数应该怎么用。

创建 Node.js 的工程

mkdir myapp
cd myapp
npm init (一路回车)

安装依赖包

npm install @apollo/server graphql

定义 Schema

创建 schema.graphql 文件,内容如下:

type User {
  id: ID!
  name: String!
  email: String!
}

enum SortBy {
  name
  email
}

enum SortDirection {
  ASC
  DESC
}

type Query {
  users(
    sortBy: SortBy = name
    sort: SortDirection = ASC
    offset: Int = 0
    limit: Int = 10
  ): [User]
}

schema 文件主要包括:

  1. 定义类型:定义了一个User类型,包括 id, name 和 email 属性;定义了两个枚举类型,分别表示排序字段和排序类型。
  2. 定义查询操作:定义了一个列表查询操作,支持按指定字段和类型排序,并支持分页查询。

实现处理器

创建 resolvers.js 文件,内容如下:

const users = [];
for (let i = 0; i < 100; i++) {
  users.push({id: i, name: 'user_' + i, email: 'user' + i + '@gmail.com'});
}

const resolvers = {
  Query: {
    users(obj, args, context, info) {
      let result = users.sort((a, b) => {
        const valueA = a[args.sortBy];
        const valueB = b[args.sortBy];
        if (valueA < valueB) {
          return -1;
        }
        if (valueA > valueB) {
          return 1;
        }
        return 0;
      });
      if (args.sort == "DESC") {
        result = result.reverse();
      }
      result = result.slice(args.offset, args.offset + args.limit);
      return result;
    },

  },
};

module.exports = resolvers;

处理器文件主要包括

  1. 准备测试数据:这里创建了一个 User 对象的数据组并初始化了几条数据。
  2. 定义处理函数:users(obj, args, context, info),其中 args 里包含了所有传递过来的参数。

主程序

创建 server.js 文件,内容如下:

const { ApolloServer } =  require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const fs = require("fs");

const typeDefs = fs.readFileSync('./schema.graphql').toString();
const resolvers = require('./resolvers');

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

startStandaloneServer(server).then(function(data) {
  console.log(`🚀 Server ready at ${data.url}`);
});

测试

启动服务

node server.js

服务启动后,访问 http://localhost:4000 进行测试。

分页查询

查询操作

query GetUsers($sortBy: SortBy, $sort: SortDirection, $offset: Int = 0, $limit: Int = 5) {
  users(sortBy: $sortBy, sort: $sort, offset: $offset, limit: $limit)  {
    id,
    name,
    email
  }
}
{
  "sortBy": "name",
  "sort": "ASC"
}

查询结果

{
  "data": {
    "users": [
      {
        "id": "0",
        "name": "user_0",
        "email": "user0@gmail.com"
      },
      {
        "id": "1",
        "name": "user_1",
        "email": "user1@gmail.com"
      },
      {
        "id": "10",
        "name": "user_10",
        "email": "user10@gmail.com"
      },
      {
        "id": "11",
        "name": "user_11",
        "email": "user11@gmail.com"
      },
      {
        "id": "12",
        "name": "user_12",
        "email": "user12@gmail.com"
      }
    ]
  }
}

相关文章

  • Graphql入门

    Graphql入门 GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API。服务端可...

  • GraphQL(七):GraphQL分页及原理分析

    基于GraphQl-JAVA 11.0 GraphQL的分页是基于游标的,游标分页的方式可以提升用户体验,关于游标...

  • Dgraph-查询语言

    查询语言 Dgraph的GraphQL+-是一种基于facebook的GraphQL的图查询语言。GraphQL并...

  • Graphql Go 基于Golang实践

    GraphQL GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL ...

  • GraphQL学习-Schema 和类型

    类型系统(Type System) 如果你之前见到过 GraphQL 查询,你就知道 GraphQL 查询语言基本...

  • hibernate中的查询

    HQL 查询所有 条件查询 分页查询 Criteria 查询所有 条件查询 分页查询 查询总记录 原生SQL

  • PRISMA快速入门之Node.js

    本文属使用Prisma构建GraphQL服务系列。 可以参见PRISMA快速入门之Typescript,大致相同。...

  • GraphQL快速入门教程

    摘要: 体验神奇的GraphQL! 原文:GraphQL 入门详解 作者:MudOnTire Fundebug经授...

  • 业务梳理(一)

    graphql入门:中文[https://graphql.cn/learn/] UI:业务信息 对应"@/comp...

  • elasticsearch 查询语句

    elasticsearch 查询语句 1、简单查询 不带参数、分页、排序查询 带分页、字段筛选查询 2、复杂查询 ...

网友评论

      本文标题:GraphQL入门之分页查询

      本文链接:https://www.haomeiwen.com/subject/bciazdtx.html