首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速开始

GraphQL是API的查询语言和运行时,用于使用现有数据完成这些查询。这是一种优雅的方法,可以解决我们使用典型REST apis时遇到的许多问题。GraphQL和REST之间有很好的比较。在这组文章中,我们不会解释GraphQL是什么,而是展示如何使用专用@nestjs/graphql模块。本章假定您已熟悉GraphQL要点。

GraphQLModule只不过是Apollo服务器的包装器。我们不重新发明轮子,而是提供一个随时可用的模块,这为GraphQL和Nest带来了一个干净的方式。

安装

首先,我们需要安装所需的包:

代码语言:javascript
复制
$ npm i --save @nestjs/graphql apollo-server-express graphql-tools graphql

入门

一旦安装了软件包,我们就可以注册了GraphQlModule

app.module.ts

JS

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
    }),
  ],
})
export class ApplicationModule {}

typePaths属性指示GraphQLModule应查找GraphQL文件的位置。此外,所有选项都将传递给底层的Apollo实例。例如,如果要禁用playground并关闭debug模式,只需传递以下选项:

app.module.ts

JS

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      debug: false,
      playground: false,
    }),
  ],
})
export class ApplicationModule {}

如上所述,所有这些设置都将转发给ApolloServer构造函数。

操场

游乐场是一个图形化的,交互式的浏览器内GraphQL IDE,默认情况下可以在与GraphQL服务器本身相同的URL上使用。当您的应用程序在后台运行时,打开Web浏览器并导航到http://localhost:3000/graphql(主机和端口可能因您的配置而异)。

多个端点

该模块的另一个有用功能是能够同时为多个端点提供服务。多亏了这一点,您可以决定哪个模块应该包含在哪个端点中。默认情况下,GraphQL在整个应用程序中搜索解析器。要仅限制模块的子集,可以使用该include属性。

代码语言:javascript
复制
GraphQLModule.forRoot({
  include: [CatsModule],
})

异步配置

通常,您可能希望异步传递模块选项,而不是事先传递它们。在这种情况下,使用forRootAsync()方法,提供了几种处理异步数据的方法。

第一种可能的方法是使用工厂功能:

代码语言:javascript
复制
GraphQLModule.forRootAsync({
  useFactory: () => ({
    typePaths: ['./**/*.graphql'],
  }),
})

显然,我们的工厂表现得像其他每一个(可能async并且能够通过注入依赖关系inject)。

代码语言:javascript
复制
GraphQLModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    typePaths: configService.getString('GRAPHQL_TYPE_PATHS'),
  }),
  inject: [ConfigService],
})

或者,您可以使用类而不是工厂。

代码语言:javascript
复制
GraphQLModule.forRootAsync({
  useClass: GqlConfigService,
})

上面的构造将GqlConfigService在内部实例化GraphQLModule,并将利用它来创建选项对象。在GqlConfigService必须实现GqlOptionsFactory的接口。

代码语言:javascript
复制
@Injectable()
class GqlConfigService implements GqlOptionsFactory {
  createGqlOptions(): GqlModuleOptions {
    return {
      typePaths: ['./**/*.graphql'],
    };
  }
}

为了防止GqlConfigService内部创建GraphQLModule并使用从不同模块导入的提供程序,您可以使用useExisting语法。

代码语言:javascript
复制
GraphQLModule.forRootAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
})

它的作用useClass与一个关键区别相同 - GraphQLModule将查找导入的模块以重新使用已创建的ConfigService,而不是单独实例化它。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com