用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。

スクリーンショット 2019-04-11 15.24.40.png

只要达到这个界面就可以了。

写GraphQL

你好世界

让我们在http://localhost:4000/graphql页面的左侧部分写下以下代码。

{
  hello
}
スクリーンショット 2019-04-11 15.27.49.png

我终于成功运行了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和姓名的意思是。

スクリーンショット 2019-04-11 16.05.58.png

我成功获得了!!!!

我大致理解了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

广告
将在 10 秒后关闭
bannerAds