如何使用GraphQL构建API?

GraphQL是一种API查询语言和运行时,它使客户端能够按需获取数据,而不是从服务器接收固定数据集。在本教程中,我们将使用Node.js和Express框架构建GraphQL API。下面是详细步骤:

## 步骤1:安装依赖

首先,需要安装Node.js和npm包管理器。在安装完成之后,通过以下命令创建一个新的npm项目,并安装必要的依赖:

```bash
mkdir graphql-api && cd graphql-api
npm init -y
npm i express graphql express-graphql
```

- `express`是一个流行的Node.js框架,用于创建Web应用程序。
- `graphql`是一个标准的查询语言和类型系统,用于API。
- `express-graphql`是一个帮助将GraphQL API添加到Express服务器的中间件。

## 步骤2:创建模型

接下来,我们将定义一个简单的模型。在这个例子中,我们将创建一个用户模型,每个用户有一个id和name属性。在项目的根目录下创建一个新的`models`目录,并在其中创建一个新的`user.js`文件。

```javascript
const users = [
  { id: 1, name: 'John' },
  { id: 2, name: 'Jane' },
  { id: 3, name: 'Bob' },
];

module.exports = {
  getUsers: () => users,
  getUserById: (id) => users.find((user) => user.id === id),
};
```

我们定义了两个方法来获取用户数据:

- `getUsers` - 返回所有用户数据。
- `getUserById` - 根据用户id返回特定用户的数据。

## 步骤3:创建GraphQL Schema

在GraphQL中,定义Schema是定义API的核心部分。在项目的根目录下创建一个新的`schema.js`文件,并使用`graphql`包定义Schema:

```javascript
const { buildSchema } = require('graphql');

const schema = buildSchema(`
  type User {
    id: ID!
    name: String!
  }

  type Query {
    getUsers: [User!]!
    getUserById(id: ID!): User
  }
`);

module.exports = schema;
```

在这个Schema中,我们定义了一个`User`类型,该类型具有`id`和`name`属性。我们还定义了两个查询方法:

- `getUsers` - 返回所有用户数据。
- `getUserById` - 根据用户id返回特定用户的数据。

## 步骤4:创建GraphQL Resolvers

在GraphQL中,Resolver用于从数据库或其他数据源中检索数据。在项目的根目录下创建一个新的`resolvers.js`文件,并实现GraphQL Schema中定义的查询方法:

```javascript
const { getUsers, getUserById } = require('./models/user');

const resolvers = {
  getUsers: () => getUsers(),
  getUserById: (args) => getUserById(args.id),
};

module.exports = resolvers;
```

我们只是将之前定义的模型方法封装成GraphQL Resolver。

## 步骤5:创建Express应用程序

6. 在resolver中处理请求

接下来我们需要在resolver中处理查询请求。我们已经定义了schema,现在我们需要在resolver中实现这些查询。resolver可以是一个对象或函数。如果是函数,函数名可以与schema中的字段名称匹配。如果是对象,则键必须匹配schema中的字段名称,并且值是一个函数,用于处理该字段的查询请求。

让我们从一个简单的例子开始,假设我们需要查询所有图书的列表。首先,我们需要在schema中定义查询类型和图书类型,如下所示:

```
type Query {
  books: [Book]
}

type Book {
  id: ID!
  title: String!
  author: String!
  publishedDate: String!
}
```

接下来,在resolver中我们需要处理books查询。我们需要一个函数来处理books查询,该函数将返回所有图书的列表。这个函数应该命名为`books`,并且必须与schema中的字段名称匹配。此外,我们需要导入`books`数据,以便我们可以使用它来返回所有图书的列表。我们需要在resolver中使用以下代码实现books查询:

```
const resolvers = {
  Query: {
    books: () => books
  }
};
```

现在我们已经定义了books查询,并在resolver中实现了它。我们可以在GraphQL Playground中测试它。在左侧的窗格中,输入以下查询:

```
{
  books {
    id
    title
    author
    publishedDate
  }
}
```

点击运行按钮,你将在右侧的窗格中看到books查询的结果。这个结果应该是一个包含所有图书信息的数组。

7. 使用mutation添加、更新和删除数据

现在我们已经学习了如何使用GraphQL查询数据。但是,如果我们需要更改数据怎么办?这就是mutation的作用。mutation允许我们添加、更新和删除数据。我们可以像处理查询一样处理mutation。

假设我们需要添加一个新图书,我们需要在schema中定义一个mutation类型和一个addBook mutation。mutation类型应该包含所有mutation,而addBook mutation应该包含所有添加图书所需的字段。如下所示:

```
type Mutation {
  addBook(title: String!, author: String!, publishedDate: String!): Book!
}
```

现在我们需要在resolver中实现addBook mutation。我们需要一个函数来处理addBook mutation,该函数将在books数组中添加新图书,并返回新添加的图书。此函数应该命名为`addBook`,并且必须与schema中的字段名称匹配。在resolver中使用以下代码实现addBook mutation:

```
const resolvers = {
  Query: {
    books: () => books
  },
  Mutation: {
    addBook: (parent, args) => {
      const book = {
        id: books.length + 1,
        title: args.title,
        author: args.author,
        publishedDate: args.publishedDate
      };
      books.push(book);
      return book;
    }
  }
};
```

现在我们已经定义了addBook mutation,并在resolver中实现了它。我们可以在GraphQL Playground中测试它。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵软件技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值