25 构建一个GraphQL API之基本API结构

在上一篇文章《实战:构建一个GraphQL API之项目需求分析》中,我们详细讨论了项目的需求,定义了API的目标和功能。现在,我们进入这一系列教程的重要一步——构建基本的API结构。在本篇中,我们将从零开始搭建GraphQL API的基本框架,并确保我们的代码结构清晰且便于扩展。

技术栈选择

在开始之前,我们首先确认即将使用的技术栈:

  • Node.js:作为后端运行时环境。
  • Express:作为Web框架。
  • Apollo Server:用于构建GraphQL服务器。
  • MongoDB:作为数据库(如果需要持久化数据)。

为了后续的教程简便起见,我们以基于Node.jsExpress的环境为基础,构建一个简单的GraphQL API。

环境搭建

首先,我们需要初始化一个新的Node.js项目。打开终端并执行以下命令:

1
2
3
mkdir graphql-api
cd graphql-api
npm init -y

接下来,安装必要的依赖项:

1
npm install express apollo-server-express graphql mongoose
  • express:轻量级的Web框架。
  • apollo-server-express:在Express上集成Apollo GraphQL服务器。
  • graphql:用于定义GraphQL的核心库。
  • mongoose:MongoDB的对象建模工具。

构建基本API结构

1. 创建项目文件结构

为了使代码结构清晰,我们可以创建如下的文件结构:

1
2
3
4
5
6
7
graphql-api/
├── src/
│ ├── models/
│ ├── schemas/
│ ├── resolvers/
│ └── index.js
└── package.json

2. 定义数据模型

src/models/目录中,我们将定义一个简单的模型,例如User。在src/models/User.js中添加以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
},
});

module.exports = mongoose.model('User', userSchema);

这段代码定义了一个表示用户的模型,包含nameemail字段。

3. 定义GraphQL Schema

src/schemas/目录下,我们定义GraphQL的Schema。在src/schemas/userSchema.js中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const { gql } = require('apollo-server-express');

const userSchema = gql`
type User {
id: ID!
name: String!
email: String!
}

type Query {
users: [User]
user(id: ID!): User
}

type Mutation {
createUser(name: String!, email: String!): User
}
`;

module.exports = userSchema;

这里,我们定义了一个User类型以及两种操作:

  • Query用于读取数据。
  • Mutation用于创建新用户。

4. 编写Resolvers

src/resolvers/目录中,创建一个文件userResolvers.js并添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const User = require('../models/User');

const userResolvers = {
Query: {
users: async () => await User.find(),
user: async (_, { id }) => await User.findById(id),
},
Mutation: {
createUser: async (_, { name, email }) => {
const user = new User({ name, email });
return await user.save();
},
},
};

module.exports = userResolvers;

在这里,我们创建了对应QueryMutation的resolver,通过Mongoose与MongoDB进行交互。

5. 将所有部分整合在一起

src/index.js中整合API的所有部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const mongoose = require('mongoose');
const userSchema = require('./schemas/userSchema');
const userResolvers = require('./resolvers/userResolvers');

const startServer = async () => {
const app = express();

mongoose.connect('mongodb://localhost:27017/graphql_api', { useNewUrlParser: true, useUnifiedTopology: true });

const server = new ApolloServer({
typeDefs: userSchema,
resolvers: userResolvers
});

server.applyMiddleware({ app });

app.listen({ port: 4000 }, () => {
console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
});
};

startServer();

在这个文件中,我们:

  • 连接到MongoDB。
  • 创建并启动Apollo Server。
  • 将GraphQL API绑定到Express应用上。

测试基本API

至此,我们已成功构建了一个基础的GraphQL API架构。可以通过运行以下命令启动服务器:

1
node src/index.js

访问 http://localhost:4000/graphql,可以使用Apollo Studio进行API的测试。

在GraphQL Playground中,可以尝试以下查询以获取用户列表:

1
2
3
4
5
6
7
query {
users {
id
name
email
}
}

和以下mutation来创建一个新用户:

1
2
3
4
5
6
7
mutation {
createUser(name: "Alice", email: "alice@example.com") {
id
name
email
}
}

小结

在本篇文章中,我们成功地构建了一个基本的GraphQL API结构。我们定义了数据模型、GraphQL schema和resolver,并将它们无缝集成到一个Express应用中。随着项目的不断发展,我们可以根据需求进一步扩展和优化我们的API。

在下一篇文章《实战:构建一个GraphQL API之部署与测试》中,我们将讨论如何将这个API部署到云端、进行测试以及监控其性能等内容,请继续关注!

25 构建一个GraphQL API之基本API结构

https://zglg.work/graphql-api-dev-zero/25/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论