API با Typescript + Nest + TypeORM + Postgres + Docker
در این پست وبلاگ، من به شما نشان خواهم داد که چگونه یک پروژه را با استفاده از TypeScript، Nest، Postgres، Docker تنظیم کنید و چگونه پایگاه داده خود را بذر کنید.
TypeScript یک زبان تایپ ایستا است که یک ابر مجموعه نحوی دقیق جاوا اسکریپت است. ایمنی نوع بهبود یافته و پشتیبانی از ابزار را ارائه می دهد و آن را به گزینه ای محبوب برای پروژه های در مقیاس بزرگتر تبدیل می کند.
لانه چارچوبی برای ساختن اپلیکیشن های کارآمد و مقیاس پذیر Node.js سمت سرور است. این یک ساختار و طیف وسیعی از ویژگی ها را ارائه می دهد که توسعه و آزمایش برنامه ها را آسان تر می کند.
Postgres یک سیستم مدیریت پایگاه داده رابطه ای منبع باز قدرتمند است که برای ساختارهای داده پیچیده و پردازش داده در مقیاس بزرگ مناسب است.
TypeORM ابزاری منبع باز Object Relational Mapping (ORM) است که راهی برای تعامل با پایگاه های داده رابطه ای مانند MySQL، PostgreSQL و SQLite ارائه می دهد. این به شما کمک می کند تا به جای نوشتن دستورات SQL خام، کدهای مرتبط با پایگاه داده را با استفاده از برنامه نویسی شی گرا در TypeScript یا JavaScript بنویسید. TypeORM ویژگی های زیادی مانند مدیریت تراکنش، انتقال پایگاه داده، ادغام اتصال و غیره را ارائه می دهد که کار با پایگاه های داده را در برنامه های شما آسان می کند.
داکر یک پلت فرم Containerization است که استقرار و اجرای برنامه ها را در محیط های مختلف آسان تر می کند. ما یک پایگاه داده Postgres و خدمات پشتیبانی را در docker راه اندازی خواهیم کرد.
لانه:
ابتدا nest-cli را نصب کنیدnpm i -g @nestjs/cli
سپس با استفاده از nest cli یک پروژه جدید ایجاد کنیدnest new project-name
انتخاب کنید: npm برای مدیریت بسته،
سپس در پوشه پروژه وارد شویدcd project-name
پایگاه داده PostgreSQL
pg را نصب کنیدnpm install pg --save
TypeORM
TypeOrm را نصب کنیدnpm install --save @nestjs/typeorm typeorm postgres
پروژه خود را با IDE خود باز کنید
در app.module.ts، اتصال را با TypeOrmModule.forRoot():
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'root',
password: 'password',
database: 'postgres',
entities: [`${__dirname}/typeorm/entities/*{.js,.ts}`],
synchronize: true, // do not use in prod
}),
],
})
export class AppModule {}
BTW: می توانید app.service و app.controller را حذف کنید
اکنون باید اولین ماژول خود را با nest cli ایجاد کنیم:nest g resource modules/users
REST API را در ترمینال انتخاب کنید
برای ایجاد نقاط ورودی CRUD، “بله” را انتخاب کنید
با ایجاد ماژول، اکنون باید پروژه خود را به این صورت سازماندهی کنیم:
1) چند پوشه به نام typeorm > database / entities / seed ایجاد کنید
2) data-source.ts، main.seed.ts و user.seed.ts را ایجاد کنید
3) موجودیت کاربر را به پوشه های موجودیت منتقل کنید
/src/typeorm
├── database
│ └── data-source.ts
├── seeds
│ └── main.seed.ts
└── entities
└── user.entity.ts *(generated by the script)*
کد زیر را در فایل ها قرار دهید:
// users.entity.ts
import { Column, CreateDateColumn, DeleteDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';
@Entity('users')
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@Column()
active: boolean;
@Column()
birthday: Date;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt: Date;
}
// users.service.ts
import { Injectable } from '@nestjs/common';
import { User } from 'src/typeorm/entities/user.entity';
import { DataSource } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Injectable()
export class UsersService {
constructor(private dataSource: DataSource) {}
private userRepository = this.dataSource.getRepository(User);
async create(createUserDto: CreateUserDto) {
return this.userRepository.save(createUserDto);
}
async findAll(): Promise<User[]> {
return this.userRepository.find();
}
async findOne(id: number) {
return this.userRepository.findOneBy({ id });
}
async update(id: number, updateUserDto: UpdateUserDto) {
let user = await this.findOne(id);
user = { ...user, ...updateUserDto };
return await this.userRepository.save(user);
}
async remove(id: number) {
const user = await this.findOne(id);
return await this.userRepository.softRemove(user);
}
}
// data-source.ts
import { DataSource, DataSourceOptions } from 'typeorm';
export const dataSourceOptions: DataSourceOptions = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'root',
password: 'password',
database: 'postgres',
entities: ['src/**/*.entity{.js,.ts}'],
};
export default new DataSource(dataSourceOptions);
// main.seed.ts
import { DataSource } from 'typeorm';
import { dataSourceOptions } from '../database/data-source';
import { User } from '../entities/user.entity';
const dataSource = new DataSource(dataSourceOptions);
const userRepository = dataSource.getRepository(User);
async function connect() {
try {
if (dataSource.isInitialized) {
await dataSource.destroy();
}
await dataSource.initialize();
console.log('Data Source has been initialized!');
} catch (err) {
console.error('Error during Data Source connect', err);
}
}
async function disconnect() {
try {
await dataSource.destroy();
console.log('Data Source disconnected!');
} catch (err) {
console.error('Error during Data Source disconnect', err);
}
}
async function seed() {
const UserSeed = () => [
{
name: 'John Doe',
email: 'john@doe.com',
active: true,
birthday: '1990-01-01',
},
{
name: 'Jane Doe',
email: 'jane@doe.com',
active: false,
birthday: '1990-01-31',
},
{
name: 'Josh Doe',
email: 'josh@doe.com',
active: true,
birthday: '2020-12-31',
},
];
await userRepository.save(UserSeed());
console.log('created seeds');
}
async function runSeed() {
await connect();
console.log('connected');
await seed();
console.log('seed done');
await disconnect();
console.log('disconnected');
}
runSeed();
اکنون، ما باید فایل ‘docker-compose.yml’ خود را در پوشه ریشه ایجاد کرده و سپس اجرا کنیم sudo docker-compose up
:
version: '3.1'
services:
db:
image: postgres:14.2-alpine
restart: always
environment:
POSTGRES_USER: "root"
POSTGRES_PASSWORD: "password"
POSTGRES_DB: "postgres"
ports:
- "5432:5432"
چند دستور مفید docker:sudo docker ps
برای فهرست کردن همه کانتینرهاsudo docker stop my_container_name
برای متوقف کردن یک ظرف خاص
حالا یک اسکریپت به package.json اضافه کنید
// package.json
"seed":"npx ts-node src/typeorm/seeds/main.seed.ts",
در یک ترمینال جدید در IDE کد را اجرا کنید npm start
برای همگام سازی پایگاه داده
برنامه را بکشید و سپس اسکریپت را اجرا کنید npm run seed
برای پر کردن پایگاه داده
انجام شد! حالا اگر فرار کنی npm start
و ارسال کنید GET
درخواست در localhost:3000/users
، باید همه کاربران را از seed دریافت کنید.