Создайте свой собственный API, используя эти популярные веб-технологии.

GraphQL и NestJS создают отличное партнерство, предоставляя вам прочную основу для ваших API и простую в использовании структуру для создания масштабируемых веб-приложений. Комбинация идеально подходит для создания готовых к производству приложений, и оба являются очень важными инструментами в современной технологической экосистеме.

Узнайте больше о том, как создать API с помощью обоих продуктов.

Что такое GraphQL?

GraphQL — это язык запросов и обработки данных. вы можете использовать для создания API более точным и лаконичным способом. GraphQL предоставляет полное и адекватное описание данных, существующих в API, и дает клиенту возможность получить точные необходимые данные.

GraphQL предоставляет множество функций, которых нет в REST API, начиная от точных запросов данных и заканчивая лучшими инструментами для разработчиков, такими как график редактор. Это также позволяет запрашивать несколько ресурсов с помощью одного запроса.

Что такое NestJS?

NestJS — это прогрессивная платформа Node.js, которую вы можете использовать для создания масштабируемых и эффективных серверных приложений. NestJS предоставляет множество плагинов, а также инструменты для быстрой и простой разработки, включая поддержку GraphQL, GRPC, WebSockets и т. д.

NestJS хорошо известен в экосистеме своей оптимизированной структурой проекта с использованием модулей, контроллеров, сервисов и схем. Его встроенный интерфейс командной строки позволяет создавать структурированную архитектуру API. Вы можете использовать принципы внедрения зависимостей для управления тем, как части приложения взаимодействуют друг с другом.

Реализация GraphQL с NestJS и MongoDB

Прежде чем создавать API с помощью NestJS и GraphQL, вам понадобятся нужные зависимости. Тебе нужно установить Node.js и NestJS, которые вы можете установить, запустив npm i -g @nestjs/cli.

В следующем примере показано простое приложение, в котором хранится информация о книгах. Выполните следующую команду в своем терминале, чтобы создать новое приложение NestJS:

гнездо новое 

Перейдите в каталог сгенерированного приложения () и установите его зависимости с помощью следующей команды:

$ npm install --save @nestjs/config @nestjs/graphql graphql-tools graphql \
 @nestjs/apollo apollo-server-express @nestjs/mongoose @types/graphql

Существует два основных подхода к созданию API-интерфейсов GraphQL, а именно:

  1. Схема-первый подход: где вы описываете API в файлах определения схемы или SDL, а NestJS генерирует определения Typescript на их основе.
  2. Код-первый подход: где вы определяете запросы, мутации и другие функции GraphQL с помощью классов и декораторов Typescript, а NestJS генерирует файлы SDL на их основе.

В следующем примере показано, как использовать подход «сначала код».

Во-первых, вам нужно инициализировать GraphQL в вашем AppModule и подключить его к базе данных MongoDB:

// app.module.ts
Импортировать {Модуль} от'@nestjs/общий';
Импортировать { GraphQLMModule как NestGraphQLModule } от'@nestjs/graphql';
Импортировать {АполлоДривер, АполлоДриверКонфиг} от'@nestjs/аполлон';
Импортировать { присоединиться } от'путь';
Импортировать {Модуль мангуста} от'@nestjs/мангуст';
Импортировать {Контроллер приложений} от'./приложение.контроллер';
Импортировать { Служба приложений } от'./приложение.сервис';
Импортировать {Модуль конфигурации, служба конфигурации} от'@nestjs/config';
Импортировать монгодбконфиг от'./config/mongodb.config';

@Модуль({
импорт: [
ConfigModule.forRoot({
загрузить: [mongodbConfig],
глобальный: истинный
}),
NestGraphQLModule.forRootAsync({
водитель: Аполло Драйвер,
ввести: [ConfigService],
использованиеФабрика: асинхронный (служба конфигурации: служба конфигурации) => ({
autoSchemaFile: присоединиться (process.cwd(), 'источник/схема.gql'),
установитьПодписные обработчики: истинный,
схема сортировки: истинный,
детская площадка: истинный,
отладка: configService.get<логический>("ОТЛАЖИВАТЬ"),
загрузки: ЛОЖЬ,
}),
}),
MongooseModule.forRootAsync({
ввести: [ConfigService],
использованиеФабрика: асинхронный (служба конфигурации: служба конфигурации) => ({
URI: configService.get('МОНГО_URI')
})
}),
],
контроллеры: [AppController],
провайдеры: [AppService],
})

экспортсорт AppModule {}

Этот модуль импортирует GraphQLMмодуль от @nestjs/graphql и МангустМодуль от @nestjs/мангуст который помогает подключиться к MongoDB. autoSchemaFile Свойство указывает расположение сгенерированного файла схемы, а сортировкаСхема Свойство гарантирует, что оно упорядочивает поля в алфавитном порядке.

Вот какая у вас MongoDB конфигурация файл должен выглядеть так:

Импортировать { зарегистрироваться как } от'@nestjs/config';

/**
 * Конфигурация подключения к базе данных Mongo
 */
экспортпо умолчанию зарегистрироваться как('mongodb', () => {
константа {
MONGO_URI
} = процесс.env;

возвращаться {
ури: `${МОНГО_URI}`,
};
});

Определение схемы GraphQL

Настроив соединения GraphQL и MongoDB, вы должны определить запросы и мутации GraphQL для создания схемы (схема.gql) файл.

Написание запросов

в подход, основанный на коде, вы создаете модель, используя Тип объекта декоратор. Позднее вы преобразуете эту модель в тип GraphQL.

Например:

// book.model.ts
Импортировать {Поле, тип объекта} от'@nestjs/graphql';
Импортировать { Опора, схема, фабрика схем} от'@nestjs/мангуст';
Импортировать {Документ} от'мангуста';

экспорттип BookDocument = Книга и документ;

@ObjectType()
@Схема()
экспортсорт Книга {
@Поле()
заголовок: нить;

@Поле()
автор: нить;

@Поле()
Дата публикации: логический;
}

экспортконстанта BookSchema = SchemaFactory.createForClass (Книга);

GraphQL по умолчанию не может использовать созданные схемы. Чтобы сделать их функциональными, вам нужна служба распознавателя, которая содержит функции для выполнения типов GraphQL. Вы можете сделать это с помощью Резольвер декоратор.

// книги.resolver.ts
Импортировать { Преобразователь, запрос, мутация, аргументы, идентификатор } от'@nestjs/graphql';
Импортировать { Книга } от'./книга.модель';
Импортировать {БукСервис} от'./книги.сервис';

@Resolver(() => Книга)
экспортсорт КнигаРезолвер {
конструктор(частный только для чтения bookService: BookService) { }

@Запрос(() => [Книга])
асинхронный книги(): Обещать {
возвращатьсяэтот.bookService.findAll();
}

@Запрос(() => Книга)
асинхронный книга(@Аргс('идентификатор', { тип: () => Я сделал: нить): Обещать {
возвращатьсяэтот.bookService.findOne (идентификатор);
}
}

Вы можете реализовать КнигаСервис, импортированные выше, следующим образом:

// книги.service.ts
Импортировать { Инъекционный } от'@nestjs/общий';
Импортировать {ИнжектМодель} от'@nestjs/мангуст';
Импортировать {Модель} от'мангуста';
Импортировать { Книга, КнигаДокумент } от'./книга.модель';

@Инъекционный()
экспортсорт BookService {
конструктор(@InjectModel(Название книги) частный книгаМодель: Модель) { }

асинхронный найти все(): Обещать {
возвращатьсяэтот.bookModel.find().exec();
}

асинхронный findOne (идентификатор: нить): Обещать {
возвращатьсяэтот.bookModel.findById (id).exec();
}
}

Вам также необходимо добавить BookResolver в список поставщиков в books.module.ts.

Импортировать {Модуль} от"@nestjs/общий";
Импортировать {Модуль мангуста} от"@nestjs/мангуст";
Импортировать {БукСервис} от'./книги.сервис';
Импортировать { БукРесолвер } от'./книги.разрешитель';
Импортировать { Книга, схема книги } от'./книга.модель';

@Модуль({
провайдеры: [
БукСервис,
BookResolver
],
импортирует: [MongooseModule.forFeature([
{
имя: Книга.название,
схема: BookSchema,
},
]),
],
})

экспортсорт Книгмодуль {}

Работа с мутациями

Пока вы используете запрос для извлечения данных в GraphQL, мутации создают или обновляют данные в базе данных. Для создания мутаций нужно принимать данные от пользователей. Тип ввода Здесь пригодится декоратор, который превращает класс в тип ввода GraphQL.

// book.input.ts
Импортировать {Тип ввода, поле} от'@nestjs/graphql';

@Тип ввода()
экспортсорт BookInput {
@Поле()
заголовок: нить;

@Поле()
автор: нить;

@Поле()
Дата публикации: логический
}

Теперь вы можете обновить book.resolver.ts выглядеть так:

Импортировать { Преобразователь, запрос, мутация, аргументы, идентификатор } от'@nestjs/graphql';
Импортировать { Книга } от'./книга.модель';
Импортировать {БукСервис} от'./книги.сервис';
Импортировать { БукВвод } от'./book.input';

@Resolver(() => Книга)
экспортсорт КнигаРезолвер {
конструктор(частный только для чтения bookService: BookService) { }

@Мутация(() => Книга)
асинхронный создать книгу (@Аргс('вход') ввод: BookInput): Обещать {
возвращатьсяэтот.bookService.create (вход);
}

@Мутация(() => Книга)
асинхронный обновить книгу (
@Аргс('идентификатор', { тип: () => Я сделал: нить,
@Аргс('вход') ввод: BookInput,
): Обещать {
возвращатьсяэтот.bookService.update(id, ввод);
}

@Мутация(() => Книга)
асинхронный удалитьКнигу(@Аргс('идентификатор', { тип: () => Я сделал: нить): Обещать {
возвращатьсяэтот.bookService.delete (идентификатор);
}
}

И книги.service.ts так:

Импортировать { Инъекционный } от'@nestjs/общий';
Импортировать {ИнжектМодель} от'@nestjs/мангуст';
Импортировать {Модель} от'мангуста';
Импортировать { Книга, КнигаДокумент } от'./книга.модель';

@Инъекционный()
экспортсорт BookService {
конструктор(@InjectModel(Название книги) частный книгаМодель: Модель) { }

асинхронный создать (книга: Книга): Обещать {
константа новая книга = новыйэтот.bookModel (книга);
возвращаться новая книга.сохранить();
}

асинхронный обновление (идентификатор: нить, книга: Книга): Обещать {
возвращатьсяэтот.bookModel.findByIdAndUpdate (id, книга, { новый: истинный }).exec();
}

асинхронныйудалить(идентификатор: нить): Обещать {
возвращатьсяэтот.bookModel.findByIdAndDelete(id).exec();
}
}

@Мутация декоратор помечает функцию как тип мутации, а @Аргс декоратор захватывает любые входные данные, переданные в функцию.

Наконец, вы должны импортировать КнигиМодуль в AppModule чтобы сделать его функциональным. Также следует пройти КнигиМодуль к forRootAsync как показано ниже.

Импортировать {Модуль книг} от'./книги/книги.модуль';
/**
 * прочий импорт
*/

@Модуль({
импорт: [
ConfigModule.forRoot({
загрузить: [mongodbConfig],
глобальный: истинный
}),
NestGraphQLModule.forRootAsync({
водитель: Аполло Драйвер,
ввести: [ConfigService],
использованиеФабрика: асинхронный (служба конфигурации: служба конфигурации) => ({
autoSchemaFile: присоединиться (process.cwd(), 'источник/схема.gql'),
установитьПодписные обработчики: истинный,
схема сортировки: истинный,
детская площадка: истинный,
отладка: configService.get<логический>("ОТЛАЖИВАТЬ"),
загрузки: ЛОЖЬ,
}),
}),
MongooseModule.forRootAsync({
ввести: [ConfigService],
использованиеФабрика: асинхронный (служба конфигурации: служба конфигурации) => ({
URI: configService.get('МОНГО_URI')
})
}),
КнигиМодуль,
],
контроллеры: [AppController],
провайдеры: [AppService],
})

экспортсорт AppModule {}

Вы можете протестировать код, запустив запуск запуска npm: dev в вашем терминале, и ваше приложение должно успешно запуститься на порту 3000.

Открыть локальный хост: 3000/graphql в вашем браузере, чтобы показать График интерфейс, где вы можете тестировать запросы и мутации. Вот пример, который показывает запрос:

А вот пример мутации:

Создавайте эффективные API с помощью NestJS и GraphQL

Создание GraphQL API в NestJS с MongoDB с использованием Mongoose включает определение схемы для GraphQL API, схемы для модели Mongoose служба для взаимодействия с базой данных и преобразователь для сопоставления операций GraphQL со службой методы.

NestJS имеет встроенные функции для создания API, включая декораторы для определения маршрутов, средства защиты для их защиты и промежуточное ПО для обработки запросов и ответов. Он также поддерживает другие базы данных, такие как PostgreSQL, MySQL и SQLite, а также другие библиотеки GraphQL, такие как Apollo и TypeGraphQL.