博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GraphQL 在 koa 框架中的实践
阅读量:6277 次
发布时间:2019-06-22

本文共 2596 字,大约阅读时间需要 8 分钟。

在之前翻译的一篇文章 中介绍 GraphQL 的作用,之后笔者在 Koa 框架中实现相关接口及调用方式并整理相关实现过程,希望对如笔者一样想要使用 GraphQL 的入门者一些帮助。

由于笔者日常工作开发中使用的Node 后台框架是 Koa,因此就以此框架为基础实现 /graphql 接口,接下来会分步介绍实现的步骤与方法。

路由配置

建立一个路由配置,笔者使用的框架对路由进行封装,只要在指定文件下新建graphql.ts文件夹即可,以下是使用 koa-router 的写法:

router.get('/graphql', async (ctx, next) => {// do something...})

数据定义

引入 js 实现 GraphQL 相关模块 ,其定义一套数据类型,用于描述我们能从服务查询到的数据,比如 graphql 定义 GraphQLObjectTypeGraphQLString, GraphQLID, GraphQLList 等相关类型,本次接口需要返回设备基本信息列表,以下是本次接口查询定义的对象

import { GraphQLObjectType, GraphQLString, GraphQLID, GraphQLList, GraphQLNonNull } from 'graphql';/***device.js*///id、 baseSn 、 baseWifi 均为数据库中字段let DeviceType = new GraphQLObjectType({   name: 'Device',   fields: {       id: {           type: GraphQLID       },       baseSn: {           type: GraphQLString        },       baseWifi: {           type: GraphQLString       }   }})export const devices = {   type: new GraphQLList(DeviceType)}

实现 GraphQL 查询入口

1. 定义查询参数和数据来源

前面定义数据的结构和类型,接下来就看一下如何定义数据来源和数据类型:

export const devices = {    type: new GraphQLList(DeviceType),    args: {         baseSn: {            type: new GraphQLNonNull(GraphQLString)        }     },    resolve(root, params, options) {        return getList({params}).then((data) => {             return data[0]        })        //the result of th getList function:        /**        * [total, devices]        * [1, [            {            baseSn,             basWifi,             id ...}        ]        */    }}

在device.js devices 对象中添加 args 属性,定义 baseSn 为查询条件,在 resolve

中调用数据查询函数作为 devices 的返回结果。

2. 定义查询入口

GraphQL 服务定义大部分都是普通对象类型,但是一个 schema 内定义两个特殊类型:

schema {   query: Query   mutation: Mutation}

每个 GraphQL 都会定义一个 query 类型作为查询入口,也会定义 mutation 定义更改操作的接口。

// schema.jsimport { GraphQLSchema, GraphQLObjectType } from 'graphql';import { devices } from './device.js'export default new GraphQLSchema({    query: new GraphQLObjectType({        name: 'Query',        fields: {            devices            // you can define other data here        }    })    //mutation: ...})

3.在 Koa 中实现

//router.js import { graphqlKoa} from 'graphql-server-koa'import schema from './schema.js'router.get('/graphal', async (ctx, next) => {    await graphqlKoa({ schema: schema })(ctx, next)    //... })

前端接口调用

前端使用 jQuery.ajax 进行调用,GraphQL 查询请求与返回的数据结构类似,在查询语句中指定需要查询的字段,比如下列查询中指定 baseSn, baseWifi 两个字段,则会在结果中返回这两个字段而没有 id 字段。

$.ajax({ url:  '**/graphql',  data: {   query: `query {     devices (baseSn: "**"){       baseSn,       baseWifi       }   }` }/*results"data": {   "devices": [   {   "baseSn": "*****************",   "baseWifi": "***"   }   ]} */

参考文献

[1]

[2]

转载地址:http://axgpa.baihongyu.com/

你可能感兴趣的文章
Django-关于manage.py migrate无效的问题
查看>>
eclipse maven创建web工程2.0转3.0
查看>>
FTP 服务器上传文件 553 Could not create file
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
知识点002-yum的配置文件
查看>>