用Apollo+Express开始学习GraphQL入门~草草理解GraphQL
首先
作為一位GraphQL的”超級新手”,我
“GraphQL 是一个类似 SQL 的 API 版本”
我只能提供一种选项来用中文转述以下内容:我只能提供一种充满小品味的解释。
我亲身接触过 GraphQL,而不仅仅是从外界了解。
“我完全了解GraphQL”
希望能够与您共享达到这一目标的流程。
※ 本人还是个初学者,请如果有错误的理解,请指正。
建立环境
安装
请安装以下的软件包。
请在各个链接中查看详细信息。
- 
- express
 
- 
- apollo-server-express
 
- graphql
$ npm i --save express apollo-server-express graphql
写代码
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
  type Query {
    hello: String
  }
`;
// Provide resolver functions for your schema fields
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};
const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });
app.listen({ port: 4000 }, () =>
  console.log(`? Server ready at http://localhost:4000${server.graphqlPath}`)
);
执行
$ node app.js
如果成功执行,将会出现以下文本。
? Server ready at http://localhost:4000/graphql
让我们尝试访问 http://localhost:4000/graphql。

只要达到这个界面就可以了。
写GraphQL
你好世界
让我们在http://localhost:4000/graphql页面的左侧部分写下以下代码。
{
  hello
}

我终于成功运行了GraphQL!
自己创建数据
让我们为GraphQL处理准备数据。只需要随便创建一个对象就好。
该对象的键是id、name、age和created_date。
exports.users = [
  {
    id: 1,
    name: 'Zonomaa',
    age: 25,
    created_date: '2019-04-05 01:35:25.000'
  },
  {
    id: 2,
    name: 'Masa',
    age: 28,
    created_date: '2019-04-10 08:23:51.000'
  },
  {
    id: 3,
    name: 'Ms',
    age: 30,
    created_date: '2019-04-10 08:32:09.000'
  }
  // ... 適当にいくつか作ってみましょう
];
将代码写在名为users.js的另一个文件中并保存。
在app.js的开头进行加载。
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
+ const { users } = require('./users');
定义模式
在GraphQL中,我们会详细描述处理的数据结构。虽然不详细列举细节,但在参考时建议参考此处等相关资料。
既然已经创建了用户,现在我们来声明它的类型。
type User {
  id: Int
  name: String
  age: Int
  created_date: String
}
让我们在 app.js 的 typeDefs 中进行补充。
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
+ type User {
+   id: Int
+   name: String
+   age: Int
+   created_date: String
+ }
  type Query {
    hello: String
  }
`;
在这个阶段,只是定义了类型,所以无法获取。
为了使其可以获取,让我们也定义一个查询吧。
由于你不再需要,故我将删除“hello”。
const typeDefs = gql`
  type User {
    id: Int
    name: String
    age: Int
    created_date: String
  }
  type Query {
-   hello: String
+   users: [User]
  }
`;
终于我能够定义一个查询了。
但是很抱歉,我无法获取用户了!
写下一个用于获得的逻辑
在学习GraphQL时我最惊讶的一点是,需要自己编写数据获取逻辑。
在 app.js 的中间层中,有一个名为 resolvers 的函数。
我们将根据在 Query 中定义的键创建一个函数在这里。
const resolvers = {
  Query: {
-   hello: () => 'Hello world!',
+   users: () => users
  },
};
我编写了返回用户的逻辑。
只有在写到这一点时,才能够从 GraphQL 中获取 Users。
请在添加代码后重新启动node任务。
$ node app.js
获取用户
让我们写一个查询并执行一下。
{
  users {
    id
    name
  }
}
从用户那里获取ID和姓名的意思是。

我成功获得了!!!!
我大致理解了GraphQL的解释。
直到我实际去碰它之前,我以为GraphQL是一个带有搜索引擎和定义好类型即可轻松进行搜索的东西。
然而,当我尝试运行它时,我才发现自己完全误解了。
实在是太丢脸了…
我的对GraphQL的理解
GraphQL是一种可以方便地从搜索引擎获取数据的工具。
從… (conveys the meaning of “from”)
GraphQL是一个新的API框架,需要努力编写获取逻辑的工具。
这个解释发生了变化。
GraphQL… 原来比想象中更加复杂…
可以选择多种数据存储方式
你可以将MySQL和FireStore等数据存储作为GraphQL的连接,并进行获取。
这次我们将JavaScript对象作为数据存储,但只要编写获取逻辑,就可以获取任何数据。
当我在研究GraphQL的时候,我看到了一些介绍文说GraphQL可以链接各种数据存储方式。一下子明白了原来是这个意思…
总结
我对GraphQL的强大之处有了认识。它与REST API完全不同,我也能够理解其广泛适用性。
然而,GraphQL的模式语言有很多种类,要理解它需要相当多的学习感觉…
下一次我们将继续推进实际的数据获取操作等实施工作。
成为GraphQL大师的道路漫漫无尽。
下一步→ 使用Apollo+Express开始GraphQL入门之旅 ~ 数据获取等级1
 
    