GraphQL

构建类型

对多数应用来说,你可以在开始运行的时候使用 GraphQL Schema Languange 声明固有的 Schema。但有些情况下,使用程序构建 Schema 也很有用。你可使用 GraphQLSchema 构造函数来做这件事。

使用 GraphQLSchema 构造函数创建 Schema 时,你在定义 QueryMutation 类型时不用单纯的 Schema Language,而是像对象一样创建它们。

例如,假设我们要实现个简单的 API,根据 id 在一些硬编码数据中查询某个用户数据。我们可以用 buildSchema 这么写:

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

var schema = buildSchema(`
  type User {
    id: String
    name: String
  }

  type Query {
    user(id: String): User
  }
`);

// 从 id 映射到 User 对象
var fakeDatabase = {
  'a': {
    id: 'a',
    name: 'alice',
  },
  'b': {
    id: 'b',
    name: 'bob',
  },
};

var root = {
  user: function ({id}) {
    return fakeDatabase[id];
  }
};

var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');

也可以在不使用 GraphQL Schema Language 的情况下实现相同的 API:

var express = require('express');
var graphqlHTTP = require('express-graphql');
var graphql = require('graphql');

// Maps id to User object
var fakeDatabase = {
  'a': {
    id: 'a',
    name: 'alice',
  },
  'b': {
    id: 'b',
    name: 'bob',
  },
};

// 定义 User 类型
var userType = new graphql.GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: graphql.GraphQLString },
    name: { type: graphql.GraphQLString },
  }
});

// 定义 Query 类型
var queryType = new graphql.GraphQLObjectType({
  name: 'Query',
  fields: {
    user: {
      type: userType,
      // `args` 描述了 `user` 查询接受的参数
      args: {
        id: { type: graphql.GraphQLString }
      },
      resolve: function (_, {id}) {
        return fakeDatabase[id];
      }
    }
  }
});

var schema = new graphql.GraphQLSchema({query: queryType});

var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');

当我们使用这种方式构建 API 时,根解析器是构建在 QueryMutation 类型, 而不是 root 对象上的。

这种方法在你想要通过一些手段(例如数据库 Schema)自动创建 GraphQL Schema 时很有用。如此一来你就可以拥有一些类似于创建和更改数据库记录的通用模板。还有,在实现类似集合类型(union types)这种没法轻易映射为 ES6 Class 或者纯 Schema Language 实现的功能时,此方法也很有用。

继续阅读 →express-graphql