下面对比一下 RESTful api 和 GraphQL 的优缺点。 优点: 声明式的接口获取 RESTful api 返回的字段冗余, 当多个终端共用接口时,尤其明显。...初始化项目 mkdir graphql-server-example cd graphql-server-example npm init --yes npm install apollo-server...本质的思想是一样的, 都是先定义 GraphQL schema ,再定义 resolver ,resolver 这里从不同地方取数,再之后就是传递 schema 和 resolver,创建实例。...resolver 函数它接收 4 个参数 fieldName(obj, args, context, info) { result } // obj:解析程序在父字段上返回的结果的对象 // args...函数第一个参数是传递外层调用的返回结果,这里我们没有嵌套 resolver ,所以我们直接用第二个参数 id 获取前端传入的参数。
在type Query下的 movie 字段中,我们使用括号定义我们可以接受的参数名和参数的类型。...尽管 Apollo Server 没有 ThinkJS 版的中间件,但是万变不离其宗,我们可以通过 Apollo Server Core 中的核心方法 runHttpQuery 进行解析。...将它安装到我们的项目中:npm install apollo-server-core graphql --save 编写中间件 runHttpQuery主要接受两个参数,第一个是 GraphQLServerOptions...前面讲到 Resolver 的时候说到,每个字段都可以对应一个 Resolver 函数,我们分别对 movies 和 actors 字段设置 Resolver 函数,将上一个 Resolver 解析出来的...const { runHttpQuery } = require('apollo-server-core'); 参照 apollo-server-koa,快速构建出 ThinkJS 版的 apollo-server
安装graphql-yoga并创建一个简单的GraphQL schema:npm init -ynpm install graphql yoga graphql-yoga# server.jsconst...查询结构:字段和参数查询结构由字段和参数组成。在上面的查询示例中,user是字段,id和email是user字段的子字段。参数如id: 1用于定制查询。4....层次结构和嵌套GraphQL查询可以嵌套,以下是一个更复杂的例子:query GetUsersAndPosts { users { id name posts { id...Directives的理解和使用Directives是GraphQL schema中用于改变执行行为的指令。它们可以被应用到类型系统定义的任何部分,比如字段、输入类型、对象类型等。...复杂查询优化利用GraphQL的字段解析器和数据加载器进行性能优化。
GraphQL 模型 一套运行中的 GraphQL 分为三层: 左侧是客户端和发出的 Document 和其他参数。...执行字段: 确定了选择集的执行顺序后开始真正的字段值的获取,非常简化的讲,Schema 中的类型应该对其每个字段提供一个叫做 Resolver 的解析函数用于获取字段的值。...在执行字段 Resolver 之后会得字段的值,如果值的类型为对象,则会继续执行其下层字段的 Resolver,如 contractedAuthor() 后得到值类型为 Author,会继续执行 name...同时虽然规范中没有规定 Resolver 缺少的情况,但引擎实现时,一般会实现一个向父层字段(即字段所在对象)取与自己同名的属性的值的 Resolver。...函数),或 apollo-server 提供的服务执行。
你可以用它来定义拥有唯一id键的实体(如Tweet和User)。你也可以用它来定义值对象,这种类型嵌套在实体内部,因此不需要唯一键(例如Stat)。 Tip 尽可能保证Type足够轻巧,然后利用组合。...根据schema的定义,该resolver函数会返回满足条件的Tweet类型对象。 针对每个Tweet对象,服务会执行对应的(Tweet.id)和(Tweet.body)resolver函数。...GraphQL有一个简单的默认resolver来处理缺少对应定义的字段。...我把数据库链接句柄对象保存在GraphQL的context中,context会作为第三个参数传递给所有的resolver函数。...不过因为context会被当做参数,我们利用它来传入测试数据集也没什么难的。
结合 React 也获得了很好的开发体验 (还在用 Redux,要不要试试 GraphQL 和 Apollo?)...安装 apollo-server-koa , 处理请求路由( egg.js 是基于 koa ) yarn add apollo-server-koa 集成中间件路由 // ~/app/graphql/index.ts...Resolvers 对于 Resolver 的处理,TypeGraphQL 提供了一些列的 decorator 来声明和处理数据。...通过 Resolver 类的方法来声明 Query 和 Mutation,以及动态字段的处理 FieldResolver。...Resolver(of => Recipe) 返回的对象添加一个字段处理 方法参数: @Root:获取当前查询对象 @Ctx:获取当前上下文,这里可以拿到 egg 的 Context (见上面中间件集成中的处理
其中 Query 对象是数据消费的入口。所有查询,都是对 Query 对象下的字段的查询。可以把 Query 下的字段,理解为一个个 RESTful API。...Resolver 的简单形式如下 ? 每个 Query 对象下的字段,都有一个取值函数,它能获取到前端传递过来的 query 查询语句里包含的参数,然后以任意方式获取数据。...我们主要使用的是 Apollo-GraphQL 的 graphql-tools 和 apollo-server-koa 两个模块,并在此基础上,进行了符合我们场景的设计和改编。...在简单场景下,中间件模式的 Resolver 跟普通函数的 Resolver,仅仅是参数的数量和返回值的方式不同。并不会增加大量的代码复杂度。 ?...每个 GraphQL Field 字段,都拥有独立的一组中间件和 ctx 对象,跟其他字段互相不影响。我们同时,可以把所有字段共享的中间件,放到 koa server 里的中间件里。 ?
age: Int } 这个 User 对象类型有两个字段,name 字段是一个为 String 的非空标量,age 字段为一个 Int 的可空标量。...一些常用的解决方案如 Apollo 可以帮省略一些简单的解析函数,比如一个字段没有提供对应的解析函数时,会从上层返回对象中读取和返回与这个字段同名的属性。...graph-pack 是集成了 Webpack + Express + Prisma + Babel + Apollo-server + Websocket 的支持热更新的零配置 GraphQL 服务环境...run dev ,浏览器打开 http://localhost:4000/ 就可以使用 GraphQL Playground 开始调试了,左边是请求信息栏,左下是请求参数栏和请求头设置栏,右边是返回参数栏...接收到数据: ', payload) } } } } 这里的 pubsub 是 apollo-server 里负责订阅和发布的类,它在接受订阅时提供一个异步迭代器
请注意,参数可以显示在任何字段中,即使是嵌套层次很深的字段。 为了让你以非常简洁的形式定义一个GraphQL查询,上面的栗子是GraphQL的一种非常简单的形式。...选择集(selection set)是一个会在GraphQL 文档中经常出现的概念,它赋予了GraphQL递归的特性,允许你获取嵌套形式的数据。...选择集(selection set):它是一次operation中需要的一组字段,或者被嵌套在其他的字段中。...GraphQL查询必须包含一个标识选择集的字段,且该字段返回的是对象类型,选择集不能设置在返回值是标量类型(Scalar Types)的字段上,例如Int或者String。...指令参数(Directive arguments): 与字段参数类似,只不过它们是被执行引擎处理,而不是传递给字段解析器(field resolver)。
接下来实现 graphql 版本: 安装用到的包: npm i @nestjs/graphql @nestjs/apollo @apollo/server graphql 然后在 AppModule...声明 resolver,用 @Query 声明查询接口,@Mutation 声明增删改接口,@Args 取传入的参数。...具体增删改查的实现和之前一样。 浏览器访问 http://localhost:3000/graphql 就是 playground,可以在这里查询: 左边输入查询语法,右边是执行后返回的结果。.../todolist.resolver'; import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin...GraphQL 主要是定义 schema 和 resolver 两部分,schema 是 Query、Mutation 的结构,resolver 是它的实现。
GraphQL 最大的一个优势在于,当给 GraphQL 语句中的字段加上合适的 GraphQL 指令后,单条 query 就可以从多个数据源中获取数据,无论本地还是远端。让我们来看看具体的方法。...要初始化一个 state link,须要将一个包含 resolvers、defaults 和 cache 字段的 object 作为参数,调用 Apollo Link 中的 withClientState...如果你没见过以上这段类型签名,不要紧张,只需记住重要的两点:query 或者 mutation 的变量通过 args 参数传递给 resolver;Apollo cache 会作为 context 参数的一部分传递给...以上的 Resolver 函数是查询和更新 Apollo cache 的方法。 若要在 Apollo cache 的根上写入数据,可以调用 cache.writeData 方法并传入相应的数据。...apollo-link-state 使用 @client 指令来标记只需存在于客户端本地的字段,然后,apollo-link-state 会在这些字段上调用相应的 resolver 方法。 .
4.1 接入 GraphQL 服务中间件 整体的技术选型阵容就是 apollo-server-koa 和 type-graphql : apollo-server 是一个在 Node.js 上构建 GraphQL...通过 Resolver 类的方法来声明 Query 和 Mutation,以及动态字段的处理 FieldResolver。...@FieldResovler:对 @Resolver(of => Recipe) 返回的对象添加一个字段处理 方法参数相关的 Decorator: @Root:获取当前查询对象 @Ctx:获取当前上下文...这里的 articleService 对象就是通过容器注入(inject)到当前 Resolver ,该对象的提供来自 Service 层 5.4 Service 层 从上可以看到,请求参数是传到 GraphQL...+ GraphQL = TypeGraphQL:阿里 CCO 体验技术部的文章,介绍地比较详细到位,推荐阅读(结合 egg.js 的开发实践) Apollo Server: GraphQL 数据分页概述
'ws://localhost:3001/graphql', options: { reconnect: true, } }) // 使用分割连接的功能 // 你可以根据发送的操作类型将数据发送到不同的连接...result ({ data }) { // 在这里用之前的结果和新数据组合成新的结果...前面我们介绍了GraphQL的概念和基础知识,这篇文章记录下使用Nestjs+GraphQL搭建Node服务。...安装 npm i --save @nestjs/graphql graphql-tools graphql apollo-server-express 注册 // app.module.ts import...import { Args, Mutation, Query, Resolver, Subscription, ResolveField, Parent, Int } from '@nestjs/graphql
下面以 apollographql 为例,并查询 People 对象。...,GraphQL 便会返回带有该字段的数据。...不仅需要在后端中配置 GraphQL 服务,用于接收 GraphQL 查询并验证和执行,此外前端通常需要 GraphQL 客户端,来方便使用 GraphQL 获取数据,目前实用比较多的是Apollo Graph...nest new nest-graphql-demo 安装依赖 npm i @nestjs/graphql @nestjs/apollo graphql apollo-server-express 修改...编写 CRUD 数据库业务代码,并在 dto 编写参数效验代码,这里简单暂时部分代码。
) { this.catsService.create(createCatDto); } 复制代码 数据验证 得益于 class-validator 与 class-transformer 对传入参数的验证变的非常简单...GraphQL GraphQL 由 facebook 开发,被认为是革命性的 API 工具,因为它可以让客户端在请求中指定希望得到的数据,而不像传统的 REST 那样只能在后端预定义。...NestJS 对 Apollo server 进行了一层包装,使得能在 NestJS 中更方便使用。...在 Express 中使用 Apollo server 时: const express = require('express'); const { ApolloServer, gql } = require...('apollo-server-express'); // Construct a schema, using GraphQL schema language const typeDefs = gql
Web Framework 框架 • apollo-server-koa 适配 koa v2 的 Apollo Server • data-loader 优化 GraphQL Resolver...这种实践模式,只能有限发挥 GraphQL 合并请求、裁剪数据集的作用。它仍然是面向数据接口,而非面向数据网络的。...如此无限堆砌数据接口,最终仍然是一个发散的模型,每增加一个数据消费场景需求,就追加一个接口字段。并且,当某些接口字段的参数,依赖其它接口的返回值,常常得重新发起一次 GraphQL 请求。...相比一维的接口列表,我们构建了高维度的数据关联网络。子字段总是可以访问到它所在得上下文里的数据,因此很多参数是可以省略的。...所有 Grandchild 都可以共用一个 resolver 实现。这种情况下,Grandchild 不假设自己的父节点,只处理自己负责的数据部分,更加内聚和简单。
接上一篇文章,由于 express 现在仍然是主流的 Node.js 服务端框架,所以今天看看 ApolloServer 怎样和 express 集成构建 GraphQL 服务。...初始化项目 mkdir myapp cd myapp npm init (一路回车) 安装依赖包 npm install @apollo/server graphql express cors body-parser...,apollo,express 和 typescript 相关的依赖包。...的schema const typeDefs = `#graphql type Query { hello: String } `; // 定义GraphQL的解析器 const resolvers..., }, }; const app = express(); const httpServer = http.createServer(app); // 使用schema和resolver创建ApolloServer
接上一篇文章,上一篇通过 express 作为 GraphQL Server 介绍了一下 GraphQL,今天说一下如何使用 Apollo Server 作为 GraphQL服务器。...创建 Node.js 的工程 mkdir myapp cd myapp npm init (一路回车) 安装依赖包 npm install @apollo/server graphql 定义 Schema..., }, }; 创建ApolloServer 使用上面定义的 schema 和 resolver 创建 ApolloServer const server = new ApolloServer({...('@apollo/server'); const { startStandaloneServer } = require('@apollo/server/standalone'); // The GraphQL...http://localhost:4000/,可以看到 Apollo Server 的 IDE 的界面,输入 query { hello } 可以看到下面的查询结果 { "data": {
领取专属 10元无门槛券
手把手带您无忧上云