首页 > 其他分享 >GraphQL 的工程应用

GraphQL 的工程应用

时间:2022-09-23 17:48:25浏览次数:55  
标签:ApolloClient const 工程 graphql 应用 GraphQL deptno type Schema

在之前的例子中,所有的 Schema 合成在一个字符串上。这显然是不符合现在大型项目分模块的开发方式。

GraphQL Schema Language

​ 在之前的例子中,所有的 Schema 合成在一个字符串上。这显然是不符合现在大型项目分模块的开发方式。

​ GraphQL Schema Languange 是相应语言实现用构造的方式去构建 Schema。以 Node.js 为例:

​ 定义对象类型数据:

const graphql = require('graphql')

const deptType = new graphql.GraphQLObjectType({
  name: 'Dept',
  fields: {
    deptno: { type: graphql.GraphQLString },
    dname: { type: graphql.GraphQLString },
    loc: { type: graphql.GraphQLString }
  }
})

module.exports = deptType

​ 定义模块的 Schema 与 Resovles

const graphql = require('graphql')
const deptType = require('./models/Dept.js')
const deptDB = require('../fakeDB/dept.js')
const { nanoid } = require('nanoid')

const getDeptByDeptno = {
  type: deptType,
  args: {
    deptno: { type: graphql.GraphQLString }
  },
  resolve: (_, { deptno }) => {
    return deptDB.find(item => {
      return deptno == item.deptno
    })
  }
}

const getAllDepts = {
  type: new graphql.GraphQLList(deptType),
  resolve: () => {
    return deptDB
  }
}

const deptInputType = new graphql.GraphQLInputObjectType({
  name: 'deptInput',
  fields: {
    dname: { type: graphql.GraphQLString },
    loc: { type: graphql.GraphQLString }
  }
})

const increaseDept = {
  type: deptType,
  args: {
    dept: {
      type: deptInputType
    }
  },
  resolve: (_, { dept }) => {
    const deptno = nanoid()
    const newInstance = {
      deptno,
      ...dept
    }
    deptDB.push(newInstance)
    return newInstance
  }
}

module.exports = {
  query: { getDeptByDeptno, getAllDepts },
  mutation: { increaseDept }
}

​ 构建 Schema

const graphqlHTTP = require('koa-graphql')
const graphql = require('graphql')

const schema = new graphql.GraphQLSchema({
  query: rootQuery,
  mutation: rootMutation
})

module.exports = graphqlHTTP({
  schema: schema,
  graphiql: true
})

​ 使用 GraphQL Schema Languange 声明固有的 Schema 相较于原本使用字符串的模式,拥有了模块化拆分、编译时校验、高维护性这些大型项目必备的功能。

ApolloClient-VueApollo

​ ApolloClient 是客户端中 GraphQL 的封装库。

​ VueApollo 是 ApolloClient 在 vue 中的插件实现。入口引入:

import ApolloClient from 'apollo-boost'
import VueApollo from 'vue-apollo'
import Vue from 'vue'
Vue.use(VueApollo)

//创建ApolloClient实例
const apolloClient = new ApolloClient({
  // 必须使用绝对路径
  uri: 'http://localhost:3000/api'
})

const apolloProvider = new VueApollo({
  defaultClient: apolloClient
})

//使用 apolloProvider 选项将它添加到你的应用程序
new Vue({
  apolloProvider,
  render: h => h(App)
}).$mount('#app')

​ ApolloClient 的 协议部分并不能用直接使用字符串,而需要 graphql-tag 将其解析转换后才能使用。

graphql-tag

​ 在客户端中开发中同样存在需要模块化、解耦合的需求,graphql-tag 作为 可以解析

Schema 字符串 与 .gql (或 .graphql) 文件,将其转换为程序可用的数据类型。

​ 工程化配置(vue-cli)

// npm install --save-dev graphql-tag
// vue.config.js
module.exports = {
  chainWebpack(config) {
    config.module
      .rule('graphql')
      .test(/\.(graphql|gql)$/)
      .use('graphql-tag/loader')
      .loader('graphql-tag/loader')
      .end()
  }
}

​ 定义一个.gql 或 .graphql 文件:

query queryGetAllDepts {
  getAllDepts {
    deptno
    dname
    loc
  }
}
query queryGetDeptByDeptno($deptno: String) {
  getDeptByDeptno(deptno: $deptno) {
    deptno
    dname
    loc
  }
}

mutation createNewDept($deptInput: deptInput) {
  increaseDept(dept: $deptInput) {
    deptno
  }
}

​ 在 VueApollo 使用:

import {  createNewDept } from 'gql/Dept.gql'

this.$apollo.mutate({
  mutation: createNewDept,
  variables: {
    deptInput: deptInput
  }
})
ApolloQueryProvider 组件使用:
<ApolloQuery :query="query">
    <template v-slot="{ result: { error, data } }">
      {{ data }}
      {{ error }}
    </template>
  </ApolloQuery>

标签:ApolloClient,const,工程,graphql,应用,GraphQL,deptno,type,Schema
From: https://www.cnblogs.com/qingzhao/p/16723532.html

相关文章

  • GraphQL概述
    一种用于API的查询语言GraphQL既是一种用于API的查询语言也是一个满足你数据查询的运行时。GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端......
  • GraphQL 中的基础概念
    字段(Fields)​ 指请求对象上特定的字段,类似于JS中的变量、Object中的key。用于指代特定的标识符。{hero{name}}​ 其中hero和name都是字段。Sch......
  • 如何从零开始成为 DevOps 工程师
    如何从零开始成为DevOps工程师资源自过去5年以来,DevOps生态系统发展迅速,但我总是看到在某些方面难以回答的同一个问题:如何成为DevOps工程师?让我在这篇文章中为......
  • 将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify
    将带有ExpressJS后端的React应用程序从Heroku迁移到NetlifyPhotoby克里斯布里格斯on不飞溅Heroku将开始对HerokuDynos收费,这是运行节点服务器所需的资......
  • CAP事件总线在NetCore中的应用
    在前面的文章中,我们介绍过Abp自带的本地事件总线,但它有几点不足1:缺乏失败重试机制,即若发布事件失败或者订阅事件处理失败,他没有重试机制,导致业务和数据异常。2:缺乏对存......
  • 关于datetime与time函数的应用
    本次工作使用爬虫,其中需要用到时间函数,进行时间格式转化,确定本地时间等,记录一下 datetime函数now_time=datetime.datetime.now()#确定当前时间end_date=now_ti......
  • Lua脚本在Redis事务中的应用实践
    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打......
  • rxjs 在 react 下的应用
    设置一个subject,然后在组件内定义一个subscription想要发送事件就用subject.next订阅就赋值subject.asObservable().subscribe()直接看代码constsubject=ne......
  • 【Azure 应用服务】如果发现当前使用的订阅无法在China North 3 区中无法创建App Ser
    问题描述在创建AppService服务时,突然发现无法选择ChinaNorth3区域,如何来解决这个问题呢? 问题解答根据Azure中服务都需要在订阅中注册的原理,因为ChinaNorth3区域......
  • Visual Studio运行OpenGL报错"应用程序无法正常启动(0xc000007b)"的解决方法
    有时在64位Windows下用VisualStudio调试运行OpenGL程序会报错,提示“应用程序无法正常启动(0xc000007b)” 原因:1.即使创建的是32位的OpenGL程序,在运行时,程序还是会到C:......