با این آموزش همراه باشید تا در مورد برخی از فناوری های مهیج و مکمل که می توانید برای پروژه بعدی خود استفاده کنید، آشنا شوید.
مانند سایر فریم ورکهای Node.js، Nest.js یک جعبه ابزار جامع برای ایجاد خدمات باطنی قوی و مقیاسپذیر ارائه میکند. با این وجود، درک نحوه اجرای کارآمد عملیات ایجاد، خواندن، بهروزرسانی و حذف (CRUD) در Nest.js بسیار مهم است – اینها اساسیترین عملیات در توسعه APIها هستند.
با نحوه ساخت یک Nest.js CRUD REST API با استفاده از TypeORM و پایگاه داده PostgreSQL آشنا شوید.
شروع کار با Nest.js
برای شروع، ابزار خط فرمان Nest.js را نصب کنید:
npm i -g @nestjs/cli
در مرحله بعد، یک پروژه جدید با اجرای:
nest new crud-app
ابزار CLI از شما می خواهد که یک مدیر بسته را انتخاب کنید، گزینه ای را که ترجیح می دهید انتخاب کنید. ما از npm، مدیر بسته Node استفاده خواهیم کرد.
CLI یک پروژه اساسی Nest.js را با تمام فایلهای پیکربندی مورد نیاز و وابستگیهای اولیه مورد نیاز برای اجرای برنامه ایجاد میکند.
در نهایت به دایرکتوری پروژه بروید و سرور توسعه را راه اندازی کنید.
cd crud-app
npm run start
می توانید کد این پروژه را در مخزن GitHub آن پیدا کنید.
یک پایگاه داده PostgreSQL ایجاد کنید
این آموزش از یک نمونه ابری PostgreSQL استفاده می کند، اما می توانید به جای آن یک پایگاه داده محلی PostgreSQL راه اندازی کنید. می توانید PostgreSQL را در ویندوز، macOS یا لینوکس نصب کنید.
برای راه اندازی یک نمونه ابری PostgreSQL:
- به ElephantSQL بروید، ثبت نام کنید و به صفحه نمای کلی حساب خود وارد شوید.
- روی دکمه Create New Instance در قسمت سمت چپ بالای صفحه کلیک کنید تا یک نمونه جدید برای برنامه خود ایجاد کنید.
- نام نمونه خود را وارد کنید، طرح رایگان را انتخاب کنید و در نهایت منطقه را برای تکمیل فرآیند راه اندازی انتخاب کنید.
- پس از ایجاد نمونه پایگاه داده، به صفحه تنظیمات بروید و URL پایگاه داده ارائه شده را کپی کنید.
اتصال پایگاه داده را پیکربندی کنید
در دایرکتوری ریشه پروژه خود، یک فایل .env ایجاد کنید و URL اتصال پایگاه داده را به صورت زیر قرار دهید:
DATABASE_URL="<your connection url here>"
حالا این بسته ها را نصب کنید:
npm install pg typeorm @nestjs/typeorm @nestjs/config
در مرحله بعد، پیش بروید و با استفاده از ابزار CLI یک ماژول پایگاه داده ایجاد کنید.
nest g module database
فایل database/database.module.ts را باز کنید و کد پیکربندی پایگاه داده زیر را اضافه کنید:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '../users/models/user.entity';
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
type: 'postgres',
url: configService.get('DATABASE_URL'),
entities: [User],
synchronize: true
}),
}),
],
})
export class DatabaseModule {}
این ماژول پایگاه داده با پیکربندی ماژول TypeORM با پارامتر اتصال مورد نیاز، URL پایگاه داده، اتصال را مدیریت می کند.
علاوه بر این، موجودیت کاربر را به عنوان بخشی از پیکربندی تعریف می کند که ساختار و ویژگی های داده های ذخیره شده در جدول پایگاه داده PostgreSQL را مشخص می کند.
در این مرحله، کد شما احتمالاً با خطا مواجه می شود زیرا هنوز موجودیت کاربران را ایجاد نکرده اید. در مراحل زیر این کار را انجام خواهید داد.
فایل app.module.ts را به روز کنید
در نهایت، ماژول برنامه اصلی را بهروزرسانی کنید تا پیکربندی ماژول پایگاه داده را در بر بگیرد.
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './database/database.module';
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ماژول کاربران را تعریف کنید
ماژول کاربران بهعنوان یک مؤلفه متمرکز عمل میکند که مسئول محصور کردن و مدیریت منطق مورد نیاز برای اجرای عملکرد CRUD API است.
این دستور ترمینال را برای ایجاد ماژول کاربران API اجرا کنید.
nest g module users
ابزار CLI به طور خودکار فایل app.module.ts را به روز می کند تا علاوه بر ایجاد ماژول کاربر، تغییرات ایجاد شده را منعکس کند. این تضمین می کند که ماژول جدید ایجاد شده، کاربران، به درستی در پیکربندی ماژول برنامه یکپارچه شده است.
یک موجودیت کاربری ایجاد کنید
TypeORM یک کتابخانه Object-Relational Mapping (ORM) است که تعاملات پایگاه داده را در برنامه هایی که از TypeScript استفاده می کنند با نگاشت اشیاء جاوا اسکریپت به جداول پایگاه داده ساده می کند.
با ایجاد یک موجودیت کاربر با استفاده از TypeORM، ساختار و ویژگی های داده های کاربر را در پایگاه داده PostgreSQL تعریف می کنید.
در فهرست کاربران، یک models/user.entity.ts جدید ایجاد کنید و کد زیر را اضافه کنید.
import { Entity, PrimaryGeneratedColumn, Column, } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
موجودیت User ساختار داده های کاربر ذخیره شده در پایگاه داده را تعریف می کند. در این مورد، این شناسه به عنوان ستون کلید اصلی، و ستونهای نام و ایمیل و ویژگیهای مربوط به آنها است.
سرویس CRUD API را ایجاد کنید
اکنون، سرویس API را ایجاد کنید که منطق عملیات CRUD را با اجرای دستور زیر مدیریت می کند:
nest g service users
فایل user-auth.service.ts را باز کنید و این کد را اضافه کنید:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import {User} from './models/user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async findAll(): Promise<User[]> {
return this.userRepository.find();
}
async findOne(id: number): Promise<User> {
return this.userRepository.findOne({ where: { id } });
}
async create(user: Partial<User>): Promise<User> {
const newuser = this.userRepository.create(user);
return this.userRepository.save(newuser);
}
async update(id: number, user: Partial<User>): Promise<User> {
await this.userRepository.update(id, user);
return this.userRepository.findOne({ where: { id } });
}
async delete(id: number): Promise<void> {
await this.userRepository.delete(id);
}
}
این کلاس UsersService متدهای API مختلفی را که برای مدیریت عملیات CRUD اختصاص داده شده است، تعریف می کند. این روش ها شامل واکشی تمام داده های کاربران، یافتن یک کاربر خاص با استفاده از شماره شناسه آنها، ایجاد کاربر جدید، به روز رسانی کاربر موجود و روشی برای حذف داده های یک کاربر خاص در پایگاه داده است.
یک کنترلر برای API تعریف کنید
یک کنترلر ایجاد کنید که نقاط پایانی API را برای عملیات مربوط به کاربر مدیریت کند.
nest g controller users
سپس کد زیر را به فایل users.controller.ts اضافه کنید.
import { Controller, Get, Post, Body, Put, Param, Delete, NotFoundException, HttpCode } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './models/user.entity';
@Controller('api/users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
async findAll(): Promise<User[]> {
return this.usersService.findAll();
}
@Post()
@HttpCode(201)
async create(@Body() user: User): Promise<User> {
const createdUser = await this.usersService.create(user);
return createdUser;
}
@Put(':id')
async update (@Param('id') id: number, @Body() user: User): Promise<any> {
await this.usersService.update(id, user);
return { message: 'User updated successfully' };
}
@Delete(':id')
async delete(@Param('id') id: number): Promise<any> {
const user = await this.usersService.findOne(id);
if (!user) {
throw new NotFoundException('User does not exist!');
}
await this.usersService.delete(id);
return { message: 'User deleted successfully' };
}
}
کنترلر نقاط پایانی API را برای عملیات کاربر مدیریت می کند. درخواستهای GET برای بازیابی همه کاربران، درخواستهای POST برای ایجاد کاربران جدید، درخواستهای PUT برای بهروزرسانی کاربران موجود، و درخواستهای DELETE برای حذف کاربران را مدیریت میکند.
این کنترلر با استفاده از UsersService و تعامل با موجودیت کاربر، یک API کامل برای مدیریت عملیات مربوط به کاربر بر روی داده های ذخیره شده در پایگاه داده ارائه می دهد.
فایل users.module.ts را به روز کنید
در نهایت، فایل users.module.ts را همانطور که در زیر نشان داده شده است به روز کنید تا مطمئن شوید که موجودیت کاربر و ماژول TypeORM را که ارتباط را با پایگاه داده برقرار می کند، در خود جای داده اید.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './models/user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService]
})
export class UsersModule {}
در نهایت، ادامه دهید و سرور توسعه را بچرخانید تا عملیات CRUD را با استفاده از Postman آزمایش کنید.
npm run start
سرور روی پورت 3000 راه اندازی می شود و می توانید درخواست های API را در http://localhost:3000/api/users به آن ارسال کنید.
ساخت برنامه های Backend با Nest.js
چه در حال توسعه یک REST API ساده یا یک برنامه وب پیچیده باشید، Nest.js مجموعه جامعی از ویژگیها و قابلیتها را برای ایجاد یک سیستم پشتیبان قابل اعتماد و قوی ارائه میدهد.
Nest.js نسبت به Express.js رویکرد ساختارمندتری برای توسعه پروژه ارائه می دهد. این تضمین میکند که به لطف الگوی طراحی سازمانیافته و مدولار آن، میتوانید با اطمینان برنامههای پیچیده را بسازید، مقیاسبندی و نگهداری کنید.