Создайте свой собственный 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, а именно:
- Схема-первый подход: где вы описываете API в файлах определения схемы или SDL, а NestJS генерирует определения Typescript на их основе.
- Код-первый подход: где вы определяете запросы, мутации и другие функции 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.