当前位置: 首页 > news >正文

GraphQL入门之查询片段的使用

前面的文章介绍了 GraphQL 的查询操作,但是有时候我们要执行类似下面的这种查询操作,在一个查询中包含多个查询操作并且返回的对象结果相同的时候,重复去写这些属性列表也是比较冗余的事情,那么怎么简化这个写法呢?下面就看看怎么通过 fragment 来简化这个写法。

query ExampleQuery {
  allusers: users {
    id
    name
    email
  }
  firstuser: user(id: 1) {
    id
    name
    email
  }
  。。。
}

创建 Node.js 的工程

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

安装依赖包

npm install @apollo/server graphql

定义 Schema

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

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

type Query {
    users: [User],
    user(id: ID!): User,
}

schema 文件主要包括:

  1. 定义模型对象:定义了一个User对象,包括 id, name 和 email 属性。
  2. 定义查询操作:定义了两个查询操作,users查询所有用户,user(id)根据id查询用户。

实现处理器

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

const user1 = {id: 1, name: 'user1', email: 'user1@gmail.com'};
const user2 = {id: 2, name: 'user2', email: 'user2@gmail.com'};
const user3 = {id: 3, name: 'user3', email: 'user3@gmail.com'};
const users = [user1, user2, user3];

const resolvers = {
  Query: {
    users: () => users,

    user(obj, args, context, info) {
      for (let user of users) {
        if (user.id == args.id) {
          return user;
        }
      }
      return null;
    },
  },
};

module.exports = resolvers;

处理器文件主要包括

  1. 准备测试数据:这里创建了一个 User 对象的数据组并初始化了几条数据。
  2. 定义处理函数:
    users:返回上面初时的 User 数组。
    user(obj, args, context, info):根据传入的 id 在 User 数组中查找,并返回查询结果。

主程序

创建 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 进行测试。

查询操作

查询操作

fragment userfields on User {
  id
  name
  email
}
query ExampleQuery {
  allusers: users {
    ... userfields
  }
  firstuser: user(id: 1) {
    ... userfields
  }
}
  1. 这里定义了一个 fragment,包含了所有需要返回的 User 类型的属性

  2. 在所有需要写返回属性的地方,使用 “…” 操作符来引用上面定义的 fragment。

执行结果

{
  "data": {
    "allusers": [
      {
        "id": "1",
        "name": "user1",
        "email": "user1@gmail.com"
      },
      {
        "id": "2",
        "name": "user2",
        "email": "user2@gmail.com"
      },
      {
        "id": "3",
        "name": "user3",
        "email": "user3@gmail.com"
      }
    ],
    "firstuser": {
      "id": "1",
      "name": "user1",
      "email": "user1@gmail.com"
    }
  }
}

相关文章:

  • python 小游戏《2048》字符版非图形界面
  • 论文阅读_参数微调_P-tuning_v2
  • Vue2 引入使用ElementUI详解
  • 基于word2vec 和 fast-pytorch-kmeans 的文本聚类实现,利用GPU加速提高聚类速度
  • cmd常用指令
  • 【Docker】Prometheus 容器部署及应用
  • 软件杯 深度学习 python opencv 实现人脸年龄性别识别
  • Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)
  • 【C++】了解一下编码
  • FPGA的时钟资源
  • 【C++刷题】优选算法——动态规划第一辑
  • 欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇
  • vue常用指令
  • 008:安装Docker
  • Unity2019.2.x 导出apk 安装到安卓Android12+及以上的系统版本 安装出现-108 安装包似乎无效的解决办法
  • 探秘Nutch:揭秘开源搜索引擎的工作原理与无限应用可能(三)
  • 【vue在主页中点击主页面如何弹出一个指定某个页面的窗口】
  • SQLiteC/C++接口详细介绍之sqlite3类(十五)
  • C++ 虚函数表
  • python之自动化(django)
  • 融创中国:境外债务重组计划聆讯定于9月15日召开
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理
  • 外国游客“在华扫货”热:“带空箱子到中国!”
  • 道指跌逾100点,特斯拉涨近5%
  • 三星“七天机”质保期内屏幕漏液被要求自费维修,商家:系人为损坏
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点