返回

**在 Nest.js 中使用 GraphQL 的最佳实践:搭建属于你的 GraphQL API 的完整攻略**

前端

Nest 与 GraphQL 实践细节整理

前言

Nest.js 和 GraphQL 是两个非常流行的框架,它们可以帮助你快速、轻松地构建 REST API。GraphQL 是一种查询语言,允许客户端指定他们想要从 API 中获取哪些数据。这使得 GraphQL 非常灵活和高效,尤其是对于需要从 API 中获取大量数据的情况。

本文将介绍在 Nest.js 中使用 GraphQL 的最佳实践。我们将讨论如何设置 Nest.js 和 GraphQL,如何使用 Nexus 来定义 GraphQL 架构,如何使用 Apollo Server 来运行 GraphQL API,以及如何对 GraphQL API 进行故障排除。

设置 Nest.js 和 GraphQL

首先,你需要安装 Nest.js 和 GraphQL 的相关依赖。你可以使用以下命令来安装它们:

npm install --save @nestjs/graphql @nestjs/apollo graphql apollo-server-express

安装完成后,你需要在你的 Nest.js 项目中创建一个新的模块来处理 GraphQL。你可以使用以下命令来创建这个模块:

nest generate module graphql

在创建的模块中,你需要导入 GraphQLModuleApolloDriverConfig,并将其添加到模块的 imports 数组中。你还需要导入 GqlOptionsFactorycreateGqlOptions 函数,并将其添加到模块的 providers 数组中。

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriverConfig } from '@nestjs/apollo';
import { GqlOptionsFactory, createGqlOptions } from './graphql.options';

@Module({
  imports: [
    GraphQLModule.forRootAsync({
      driver: ApolloDriverConfig,
      useClass: GqlOptionsFactory,
    }),
  ],
  providers: [GqlOptionsFactory],
})
export class GraphqlModule {}

graphql.options.ts 文件中,你需要实现 GqlOptionsFactory 接口,并返回一个 GqlOptions 对象。在这个对象中,你需要指定 GraphQL 架构的路径,以及其他一些选项。

import { Injectable } from '@nestjs/common';
import { GqlModuleOptions, GqlOptionsFactory } from '@nestjs/graphql';
import { join } from 'path';

@Injectable()
export class GqlOptionsFactory implements GqlOptionsFactory {
  createGqlOptions(): GqlModuleOptions {
    return {
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.ts'),
        outputAs: 'class',
      },
    };
  }
}

使用 Nexus 定义 GraphQL 架构

接下来,你需要使用 Nexus 来定义 GraphQL 架构。Nexus 是一个 GraphQL 架构生成器,它可以帮助你轻松、快速地定义 GraphQL 架构。

首先,你需要在你的 Nest.js 项目中安装 Nexus。你可以使用以下命令来安装它:

npm install --save @nexus/schema

安装完成后,你需要在你的 Nest.js 项目中创建一个新的文件来定义 GraphQL 架构。你可以使用以下命令来创建这个文件:

touch src/graphql.ts

graphql.ts 文件中,你需要导入 makeSchema 函数,并使用它来定义 GraphQL 架构。

import { makeSchema } from '@nexus/schema';

const schema = makeSchema({
  types: [
    {
      name: 'User',
      fields: {
        id: { type: 'Int' },
        name: { type: 'String' },
        email: { type: 'String' },
      },
    },
    {
      name: 'Query',
      fields: {
        users: {
          type: 'User',
          list: true,
          resolve: () => {
            return [
              {
                id: 1,
                name: 'John Doe',
                email: 'johndoe@example.com',
              },
              {
                id: 2,
                name: 'Jane Doe',
                email: 'janedoe@example.com',
              },
            ];
          },
        },
      },
    },
  ],
});

export { schema };

使用 Apollo Server 运行 GraphQL API

现在,你需要使用 Apollo Server 来运行 GraphQL API。Apollo Server 是一个 GraphQL 服务器,它可以帮助你快速、轻松地运行 GraphQL API。

首先,你需要在你的 Nest.js 项目中安装 Apollo Server。你可以使用以下命令来安装它:

npm install --save apollo-server-express

安装完成后,你需要在你的 Nest.js 项目中创建一个新的控制器来处理 GraphQL 请求。你可以使用以下命令来创建这个控制器:

nest generate controller graphql

在创建的控制器中,你需要导入 QueryMutation,并将其添加到控制器的 @Controller() 装饰器中。你还需要导入 UseGuardsGqlAuthGuard,并将其添加到控制器的 @UseGuards() 装饰器中。

import { Controller, Get, UseGuards, Post, Query, Mutation } from '@nestjs/common';
import { Query, Mutation } from '@nestjs/graphql';
import { GqlAuthGuard } from './graphql.guard';

@Controller('graphql')
@UseGuards(GqlAuthGuard)
export class GraphqlController {
  @Query()
  hello() {
    return 'Hello, world!';
  }
}

对 GraphQL API 进行故障排除

在开发 GraphQL API 时,你可能会遇到一些问题。以下是一些常见的 GraphQL API 问题及其解决方案:

  • 错误消息:Cannot query field "user" on type "Query".
    • 解决方案:确保你已经在 GraphQL 架构中定义了 user 字段。
  • 错误消息:Field "users" must have a type.
    • 解决方案:确保你已经在 GraphQL 架构中为 users 字段指定了类型。
  • 错误消息:Argument "id" of type "Int!" is required, but it was not provided.
    • 解决方案:确保你在查询中提供了 id 参数。

结论

在本文中,我们介绍了在 Nest.js 中使用 GraphQL 的最佳实践。我们讨论了如何设置 Nest.js 和 GraphQL,如何使用 Nexus 来定义 GraphQL 架构,如何使用 Apollo Server 来运行 GraphQL API,以及如何对 GraphQL API 进行故障排除。

我希望本文对你有帮助。如果你有任何问题,请随时给我留言。