პირველ რიგში დაგვჭირდება რომ დავაყენოთ ნესტის cli ჩვენს გარემოში.
bashnpm install -g @nestjs/cli
ამის შემდეგ უნდა შევქმნათ ნესტის ახალი პროექტი:
bashnest new nestjs-mongoose-crud
დავდგეთ შექმნილ აპლიკაციაზე და დავაყენოთ დამატებითი დიფენდენსიები რაც დაგვეხმარება რომ ვემუშაოთ მონგოს.
bashnpm i @nestjs/mongoose mongoose @nestjs/config
ამის შემდეგ ჩვენ დავგჭირდება შევიდეთ მონგოდბატლასზე და შევქმნათ ახალი კლასტერი. შეგიძლიათ მის გარეშეც ლოკალურად დაუკავშირდეთ მონგოს, თუმცა დღეს განვიხილავთ კლასტერზე დაკონფიგურირებულ მოგნოს.
ახალი კლასტერის შემქნის შემდეგ მონგო მოგცემს დაკავშირების სტრინგს(connection string) რომელსაც დავაკოპირებთ და ჩავწერ .env ფაილში.
შევქმნათ .env ფაილი root-დონეზე და ჩავწეროთ შიგნით მსავსი რამ
txtMONGO_URL=mongodb+srv://username:password@...
ამის შემდეგ გადავიდეთ app.module.ts ფაილში და დავაინიციალიზიროთ მონგოს მოდული.
tsimport { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ConfigModule } from '@nestjs/config'; import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ ConfigModule.forRoot({isGlobal: true}), MongooseModule.forRoot(process.env.MONGO_URL), ], controllers: [AppController], providers: [AppService], }) export class AppModule{}
შემდეგ გავხნსნათ ტერმინალი და შევქმნათ ახალი რესურსი
bashnest g res users
ეს ბრძანება შეგვიქმინს ახალ იუზერების ქრადს. შევიდეთ entity ფოლდერში და ვნახოთ users.entity.ts ფაილი, ამ ფაილში უნდა აღვწეროთ როგორ უნდა გამოიყურებოდეს ერთი იუზერის ობიექტი ბაზაში, ანუ აღვწეროთ იუზერის სქემა.
tsimport { Prop, Schema, SchemaFactory } from "@nestjs/mongoose"; import mongoose from "mongoose"; @Schema({timestamps: true}) export class User { @Prop({type: String, required: true}) fullName: string @Prop({type: Number}) age: number @Prop({type: String, unique: true}) email: string } export const UserSchema = SchemaFactory.createForClass(User)
არ დაგავიწყდეთ სქემა ყოველთვის უნდა მონიშნოთ @Schema დეკორატორით და თიოთეული ფილდი უნდა მონიშნოთ @Prop დეკორატორით.
ამის შემდეგ უნდა გადავიდეთ users.module.ts ში და დავაიმპორთოთ იუზერის სქემა.
tsimport { Module } from '@nestjs/common'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { MongooseModule } from '@nestjs/mongoose'; import { User, UserSchema } from './schema/user.schema'; @Module({ imports: [MongooseModule.forFeature([{name: User.name, schema: UserSchema}])], controllers: [UsersController], providers: [UsersService], exports: [UsersService] }) export class UsersModule {}
name: User.name -ამის ნაცვლად შეგიძლიათ ჩაწეროთ name: 'user'
ამის შემდეგ გადავინაცვლოთ dto ფოლდერში სადაც იქნება create-user.dto.ts ფაილი და ვალიდაციები დავადოთ იუზერის მიერ გამოგზავნილ დეითას.
ვალიდაციებისთვის მე ვიყენებ ხოლმე class-validator class-transfomers-ს.
დავაინსტალიროთ შემდეგი ბიბლიოთეკები
bashnpm i class-validator class-transformer
დავადოთ ვალიდაცები create-user.dto.ts
tsimport { IsEmail, IsNotEmpty, IsString, IsNumber } from "class-validator"; export class CreateUserDto { @IsNotEmpty() @IsString() fullName: string @IsNotEmpty() @IsNumber() age: string @IsNotEmpty() @IsEmail() email: string }
ეს ვალიდაციები არ იმუშავებს მანამ სანამ main.ts ში არ დააკნფიგურირებთ main.ts
tsimport { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe()) await app.listen(process.env.PORT ?? 3000); } bootstrap();
ამის შემდეგ დაგვჭირდება შევიდეთ user.service.ts ფაილში დიფენდენსი ინჯექშენის გამოყენით შევიტანოთ მონგოს მოდელი და დავწეროთ crud.
tsimport { BadGatewayException, BadRequestException, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { InjectModel } from '@nestjs/mongoose'; import { User } from './schema/user.schema'; import { isValidObjectId, Model } from 'mongoose'; @Injectable() export class UsersService { constructor(@InjectModel(User.name) private userModel: Model<User>){} async create(createUserDto: CreateUserDto) { const existUser = await this.userModel.findOne({email: createUserDto.email}) if(existUser) throw new BadRequestException('user already exsist') const user = await this.userModel.create(createUserDto) return user } findAll() { return this.userModel.find() } async findOne(id: string) { if(!isValidObjectId(id)) throw new BadGatewayException('Not valid id is provided') const user = await this.userModel.findById(id) return user } async update(id: string, updateUserDto: UpdateUserDto) { if(!isValidObjectId(id)) throw new BadGatewayException('Not valid id is provided') const updatedUser = await this.userModel.findByIdAndUpdate(id, updateUserDto, {new: true}) return {message: 'user updated successfully', data: updatedUser} } async remove(id: string) { if(!isValidObjectId(id)) throw new BadGatewayException('Not valid id is provided') const user = await this.userModel.findByIdAndDelete(id) return {message: 'user deleted successully', data: user} } }
ამის შემდეგ უკვე შევიდეთ users.controller.ts ში და ეს სერვისები დავაკავშიროთ შესაბამის როუტებს. app.controller.ts
tsimport { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; @Controller('users') export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() create(@Body() createUserDto: CreateUserDto) { return this.usersService.create(createUserDto); } @Get() findAll() { return this.usersService.findAll(); } @Get(':id') findOne(@Param('id') id: string) { return this.usersService.findOne(id); } @Patch(':id') update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) { return this.usersService.update(id, updateUserDto); } @Delete(':id') remove(@Param('id') id: string) { return this.usersService.remove(id); } }
ამის შემდეგ უკვე შეგიძლიათ დასტარტოთ თქვენი აპლიკაცია, გახსნათ პოსტმენი და დატესტოთ თქვენი ქრადი შემდეგ ენდფოინთებზე შმდეგი მეთოდებით
bashnpm run start:dev
/users GET ყველა იუზერის წამოღება
/users POST იუზერის შექმნა ბადიში უნდა გაატანოთ იუზერის ინფო
/users/:id GET ერთი იუზერის წამოღება ბაზიდან
/users/:id PATCH იუზერის დააფდეითება, აქაც ბადიში უნდა გაატანოთ რისი შეცვლაც გინდათ
/users/:id DELETE ერთი იუზერის წაშლა
დღეისათვის სულ ეს იყო იმედია მოგეწონათ ბლოგი.