Создание API для создания записи с использованием NestJS и Prisma
NestJS — это мощный фреймворк для создания серверных приложений, а Prisma — современный ORM для работы с базами данных. Вместе они позволяют быстро и эффективно создавать API. Вот пошаговое руководство для создания API с использованием этих технологий.
1. Установка зависимостей
Сначала создайте новый проект NestJS и установите Prisma:
bash
1 2 3 4 5 6 | # Создание нового проекта NestJS nest new my-nestjs-app # Установка Prisma и клиента npm install @prisma/client npm install prisma --save-dev |
Инициализируйте Prisma:
bash
1 | npx prisma init |
2. Настройка Prisma Schema
В файле prisma/schema.prisma
настройте модель данных. Например, создадим модель Post
:
prisma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" // Или другой провайдер, например, PostgreSQL url = "file:./dev.db" } model Post { id Int @id @default(autoincrement()) title String content String createdAt DateTime @default(now()) } |
После этого выполните миграцию для создания таблицы в базе данных:
bash
1 | npx prisma migrate dev --name init |
3. Генерация Prisma Client
После настройки схемы выполните команду для генерации Prisma Client:
bash
1 | npx prisma generate |
4. Настройка Prisma в NestJS
Создайте модуль Prisma для интеграции с NestJS. Это позволит инкапсулировать логику работы с Prisma.
Создание Prisma модуля
Создайте файл src/prisma/prisma.module.ts
:
typescript
1 2 3 4 5 6 7 8 9 | import { Global, Module } from '@nestjs/common'; import { PrismaService } from './prisma.service'; @Global() @Module({ providers: [PrismaService], exports: [PrismaService], }) export class PrismaModule {} |
Создайте файл src/prisma/prisma.service.ts
:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 | import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { async onModuleInit() { await this.$connect(); } async onModuleDestroy() { await this.$disconnect(); } } |
Добавьте модуль Prisma в AppModule
:
typescript
1 2 3 4 5 6 7 8 | import { Module } from '@nestjs/common'; import { PrismaModule } from './prisma/prisma.module'; import { PostsModule } from './posts/posts.module'; @Module({ imports: [PrismaModule, PostsModule], }) export class AppModule {} |
5. Создание модуля для работы с записями
Сгенерируйте модуль и контроллер для работы с записями:
bash
1 2 3 | nest generate module posts nest generate controller posts nest generate service posts |
Настройка PostsService
В файле src/posts/posts.service.ts
добавьте логику для создания записи:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 | import { Injectable } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; @Injectable() export class PostsService { constructor(private readonly prisma: PrismaService) {} async createPost(data: { title: string; content: string }) { return this.prisma.post.create({ data, }); } } |
Настройка PostsController
В файле src/posts/posts.controller.ts
настройте маршрут для создания записи:
typescript
1 2 3 4 5 6 7 8 9 10 11 12 | import { Body, Controller, Post } from '@nestjs/common'; import { PostsService } from './posts.service'; @Controller('posts') export class PostsController { constructor(private readonly postsService: PostsService) {} @Post() async createPost(@Body() body: { title: string; content: string }) { return this.postsService.createPost(body); } } |
6. Тестирование API
Запустите сервер:
bash
1 | npm run start |
Отправьте POST-запрос на http://localhost:3000/posts
с телом:
json
1 2 3 4 | { "title": "Пример записи", "content": "Это содержимое записи" } |
Вы получите ответ с созданной записью.
7. Дополнительно
- Вы можете добавить валидацию данных с помощью
class-validator
иclass-transformer
. - Для работы с другими базами данных (например, PostgreSQL) измените
provider
иurl
вschema.prisma
.
Теперь у вас есть API для создания записей с использованием NestJS и Prisma! 🚀