GraphQL介绍&使用nestjs构建GraphQL查询服务

GraphQL介绍&使用nestjs构建GraphQL查询服务(文章底部附demo地址)

GraphQL一种用为你 API 而生的查询语言。出自于Facebook,GraphQL非常易懂,直接看查询语句就能知道查询出来的数据是什么样的。本质上属于API Layer层,负责前端请求的合并、数据整理等功能。

查询示例

使用几个简单的例子看下GraphQL的查询是什么样子的。

普通查询

{
  me {
    name
  }
}

查询出来的数据格式如下:

{
  "me": {
    "name": "wanghao"
  }
}

1、返回来的数据是一个json
2、返回数据格式和查询完全一致

带参数的嵌套查询

入参格式:

{
  user(id: 6) {
    name,
    profilePicture {
      width,
      height,
      url
    }
  }
}

查询出来的数据如下:

{
  "me" {
    "name": "wanghao,"
    "profilePicture": {
      "width": 50,
      "height": 50,
      "url": "https://cdn/some.jpg"
    }
  }
}

当然,profilePicture查询时也可以指定参数:

{
  me {
    name,
    profilePicture(size: 300) {
      width,
      height,
      url
    }
  }
}

输出可能如下:

{
  "me" {
    "name": "wanghao,"
    "profilePicture": {
      "width": 300,
      "height": 300,
      "url": "https://cdn/300.jpg"
    }
  }
}

指定别名查询

有时候同一字段我们想要查询两次,但是两次指定的参数不同,比如一个用户有多张头像,我们只想查询其中的2张,可以如下:

{
  me {
    name,
    littlePic: profilePicture(size: 50) {
      width,
      height,
      url
    },
    bigPic: profilePicture(size: 300) {
      width,
      height,
      url
    }
  }
}

输出结果如下:

{
  "me" {
    "name": "wanghao,"
    "littlePic": {
      "width": 50,
      "height": 50,
      "url": "https://cdn/50.jpg"
    },
    "bigPic": {
      "width": 300,
      "height": 300,
      "url": "https://cdn/300.jpg"
    }
  }
}

更多查询请参考:http://graphql.cn/learn/queries/

变更

查询只适用于数据查询,但是往往接口还有部分新增、修改、删除操作,这个时候就需要使用变更(Mutations)。

想要新增一条数据,简单的变更入参如下:

mutation($inputComment: CommentInput!) {
  addComment(data: $inputComment)
}

其中$inputComment是GraphQL中的变量写法,具体如下:

{
  "inputComment": {
    "postId": "5a796104fe9b131a10d9627d",
    "text": "测试评论部分23232"
    }
}

返回数据直接如下:

{
  "data": {
    "addComment": true
  }
}

实际请求时的数据格式

GraphQL请求时不限制get、post请求,如果是get,会自动将请求体放在query中,看下实际请求时入参是什么样子的:

{
    query: "mutation($inputComment: CommentInput!) {?  addComment(data: $inputComment)?}??"
    variables: "{?  "inputComment": {?"postId":"5a796104fe9b131a10d9627d",?"text":"测试评论部分23232"?}"
}

可以看出,请求时实际发送的是一串字符串至GraphQL服务器,GraphQL服务器会自动解析该字符串内容。

GraphQL可视化查询工具

GraphQL的所有实现基本都有实现该可视化工具,进行简单配置即可查看,express-graphql模块配置如下:

// GraphqQL server route
app.use('/graphql', graphqlHTTP(req => ({
  schema,
  pretty: true,         // 配置显示pretty按钮进行代码美化
  graphiql: true,       // 配置开启可视化查询
})));

dataloader

N+1查询问题

# 定义
type User {
  name: String,
  friends: [User]
}

#查询
{
  users {
    name
    friends {
      name
      friends {
        name
      }
    }
  }
}

GraphQL支持嵌套查询,如果没有dataloader,就会出现严重的N+1查询性能问题。

Dataloader(官方网址)是由facebook推出,能大幅降低数据库的访问频次,经常在Graphql场景中使用。

import Sequelize from 'sequelize'
import DataLoader from 'dataloader'

// 定义表结构
const sequelize = new Sequelize('test', null, null, {
        dialect: 'sqlite',
    })
const UserModel = sequelize.define('user', {
    name: Sequelize.STRING
})
await sequelize.sync({force: true})

//插入测试数据
await [
    UserModel.create({name: 'ron'}),
    UserModel.create({name: 'john'}),
]

// 初始化DataLoader,传入一个批处理函数
const userLoader = new DataLoader(keys => UserModel.findAll({where: {name: {$in: keys}}})) 

// 以下2个Load语句会被自动批处理,合并成一次数据库的操作
await [
    userLoader.load('ron'),
    userLoader.load('john')
]
Executing (default): SELECT id, name, createdAt, updatedAt FROM users AS user WHERE user.name IN ('ron', 'john’);

DataLoader缓存的典型应用是per-request范围的缓存,不能取代redis等应用级别的缓存。

使用nestjs构建GraphQL Server服务

nestjs,官网地址:https://docs.nestjs.com,是一个使用typescript构建nodejs后端应用的框架,类似java中的spring框架:依赖注入、拦截器、过滤器、装饰器模式等等,比较看好。

使用nestjs搭配GraphQL、typeorm、mysql实现了一个简单的GraphQL查询服务,查询支持单个查询、列表查询、关联查询,变更支持修改、删除操作,具体demo地址: https://github.com/caiya/graphql-nestjs-typeorm

原文地址:https://www.cnblogs.com/vipzhou/p/8432489.html

时间: 2024-08-03 03:47:18

GraphQL介绍&使用nestjs构建GraphQL查询服务的相关文章

Graphql介绍(Introduction to GraphQL)

Introduction to GraphQL GraphQL介绍 Learn about GraphQL, how it works, and how to use it in this series of articles. Looking for documentation on how to build a GraphQL service? There are libraries to help you implement GraphQL in many different langua

Yii2快速构建RESTful Web服务功能简介

Yii2相比Yii1而言,一个重大的改进是内置了功能完备的RESTful支持. 其内置RESTful支持提供了如下功能: 使用ActiveRecord的通用接口来快速构建原型: 应答格式协商(缺省支持 JSON 和 XML): 可定制的对象序列化,支持选择输出哪些列: 请求数据的格式化以及验证错误: 通过HTTP 动词映射实现高效路由: 支持 OPTIONS 和 HEAD 动词: 认证 和 鉴权: 支持 HATEOAS(RESTful的架构约束,超媒体即应用程序状态): 结果缓存,可使用 yii

【干货】手动搭建一套可自动化构建的微服务框架

如何阅读 本文篇幅较长,我花了两天的时间完成,大约需要半小时阅读. 本文分为理论篇和实践篇,由于代码在手机端展示并不理想,建议大家收藏之后在PC端阅读.实践篇边动手边阅读更有助于理解. 在阅读的同时,也麻烦各位大佬多多分享! 本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构你的整个应用程序将会被拆分成一个个功能独立的子系统,独立运行

用.net访问电子枢纽信用中心的数据查询服务

概要说明 电子枢纽全称国家交通运输物流公共信息平台,主要提供物流及生产企业进行物流相关数据交换的标准和API,详细介绍可参考其官网www.logink.org,本文假定阅读者对该平台已有了解,并已成功申请了相应的帐号和数据交换服务. 信用中心是电子枢纽众多数据服务中的一个,提供物流参与者信用信息的上传和查询,包括运输车辆.从业人员等.官方的示例和介绍大多以Java为主,.net的非常少,希望本文可以帮助.net开发人员快速掌握数据交换方式. 电子枢纽的数据服务分为两种,一种称为数据交换,另一种称

使用RpcLite构建SOA/Web服务(Full .Net Framework)

使用RpcLite构建SOA/Web服务(Full .Net Framework) SOA框架系列 1. 使用RpcLite构建SOA/Web服务 2. 使用RpcLite构建SOA/Web服务(Full .Net Framework) 继前一篇文章<使用RpcLite构建SOA/Web服务>已过去好几个月.在这几个月里对RpcLite作了很多修改如:.Net Core的支持.Fluent API方式配置.Monitor.Filter等功能. 前一篇文章介绍了使用RpcLite的基本用法,在文

使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

RESTful Web 服务简单介绍 REST 在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之中的一个. REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识. client应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集.RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务.通常,RESTful Web 服

使用RpcLite构建SOA/Web服务

使用RpcLite构建SOA/Web服务 SOA框架系列 1. 使用RpcLite构建SOA/Web服务 提到Web服务最先想到的就是WebService此外常用的还有WCF.ServiceStack.WebApi等. RpcLite是一个开源的轻量级SOA服务框架,除了基本的提供Web服务还包括SOA治理系统(本文暂不展开在后继的文章会详细说明).RpcLite与WCF比较像,下面介绍使用方法. 1.   创建一个Web项目,Framework选择>=4.0 2.   从NuGet中添加Rpc

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka 什么是服务治理 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现. 为什么需要服务治理模块 在最初构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务调用 此时看着一切都还正常. 随着项目逐渐接近尾声,维护人员需要维护的服务越来越多,越来越复杂,最终形成大量的配置文件,维护将会变得越来越困难.此时,微服务应用实例自动化管理框架变得

基于jersey和Apache Tomcat构建Restful Web服务(一)

基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来越多网站的采用.那么问题来了,它是什么呢? 起源 REST(Representational state transfer)在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources