Egg.js 中 GraphQL 小试牛刀

1,472 阅读1分钟
原文链接: zhuanlan.zhihu.com
Egg.js 笔记系列
继上上篇撸完了简易版的阿里云 CS 控制台,用 GraphQL 继续武装一番~

1. 安装&配置

1.1 安装插件

yarn add egg-graphql

1.2 开启插件

// {rootDir}/config/plugin.js
'use strict';

// had enabled by egg
// exports.static = true;

exports.graphql = {
  enable: true,
  package: 'egg-graphql',
};

1.3 配置插件

// {rootDir}/config/config.{env}.js

// 加载中间件,使用访问:http(s)://{host}:{port}/graphql
exports.middleware = [ 'graphql' ];

exports.graphql = {
  router: '/graphql',
  // 是否加载到 app 上,默认开启
  app: true,
  // 是否加载到 agent 上,默认关闭
  agent: false,
};

2. 使用

2.1 基本结构

// {rootDir}/app/graphql
.
├── common
│   ├── resolver.js
│   ├── scalars
│   │   └── date.js
│   └── schema.graphql
├── docker
│   ├── connector.js
│   ├── resolver.js
│   └── schema.graphql
└── query
    ├── resolver.js
    └── schema.graphql

2.2 Query

schema

// query/schema.graphql

type Query {  
  docker: Docker
}

resolver

'use strict';

module.exports = {
  Query: {
    docker(root, params, ctx) {
      return [];
    },
  },
};

2.3 Docker

schema

// docker/schema.graphql

type Docker {
  images(id: Int, limit: Int, offset: Int): [Image] 
  clusters(name: String): [Cluster]
}

type Image {
  id: Int!  
  namespace: String!
  region: String!
  name: String!
  repo_full_name: String!  
  tags: [Tag]
}

type Tag {
  id: Int!
  digest: String!
  tag: String!
  pushed_at: Date!  
}

type Cluster {
  id: Int!
  name: String!
  region: String!  
  created_at: Date!
  # masterUrl: String!
  # ca: String!
  # key: String!
  # cert: String!
}

resolver

// docker/resolver.js
'use strict';

module.exports = {
  Docker: {
    images(parent, { id, limit, offset }, ctx) {
      return ctx.connector.docker.getImages(id, limit, offset);
    },
    clusters(parent, { name }, ctx) {
      return ctx.connector.docker.getClusters(name);
    },
  },
};
嵌套结构下,第一个参数为上层的结果,Query 下为 root,Docker 下为上层的结果

3. 效果

4. 链接