برنامه نویسی

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 دریافت کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا