سلام به همه!
چند وقتی میشه که پریسما جای خودشو تو دنیای وب باز کرده ولی یکی از ایراداتی که به این ابزار قدرتمند وارده اینه که به راحتی نمیشه اونو با دیتابیس Mongo به صورت local استفاده کرد (ولی کار نشد نداره ?)! برای انجام اینکار باید از قابلیت Replication دیتابیس مونگو، که به منظور ایجاد چند نسخه از یک دیتابیس برای افزایش دسترسی و کاهش احتمال از بین رفتن دیتا هست، استفاده کنیم.
توی این مقاله میخوام یه مینی پروژه باهم راه بندازیم و از پریسما برای مدیریت دیتابیس خودمون همراه با فریمورک NestJs و Docker بر روی سیستم عامل Windows استفاده کنیم.
اگه قبل از اینکه شروع کنیم یه آشنایی کوچیک با ابزار هامون داشته باشیم بنظرم میتونه کمک کننده باشه (اگر با این ابزار ها آشنایی دارید این قسمت رو رد کنید) :
داکر ابزاری است که میتواند فرایند ایجاد، پیاده سازی و اجرای برنامهها را با استفاده از Container ها بسیار ساده کند و سرعت و عملکرد برنامه بهبود قابل ملاحظهای پیدا کند و حجم آن نیز کاهش یابد.
پریسما یک ORM قدرتمند برای Nodejs و TypeScript هست که به منظور تسهیل روند کار با دیتابیس های مختلف بوجود اومده (مثل PostgreSQL ، SQL Server ، MongoDB و … ) و از نمونه های مشابه اون میتونیم به TypeORM و Mongoose اشاره کنیم.
فریمورک NestJs برای توسعه سمت سرور ایجاد شده که از TypeScript و Express (یا Fastify) به عنوان هسته مرکزی خود استفاده میکند. با استفاده از این فریمورک میتونیم انواع Api های مختلف مثل REST و GraphQL و ...، رو به راحتی ایجاد کرد.
نود جی اس یک Runtime جاوااسکریپتیه که از موتور جاوااسکریپتی V8 کروم استفاده میکنه و قابلیت اجرای کد های این زبان رو در خارج از محیط مرورگر برای ما فراهم میکنه.
خب برای شروع اگر NodeJS را بر روی سیستم خود ندارید از اینجا دانلود و نصب کنید.
سپس فایل نصب Docker رو از اینجا دانلود و نصب کنید:
مراحل نصب داکر رو به ترتیب جلو برید تا نصب بشه و اگر بعد از نصب هنگام راه اندازی داکر با خطای زیر مواجه شدید فایل WSL2 Linux kernel update را از اینجا دانلود و نصب کنید و سیستم خود را ری استارت کنید.
بعد از راه اندازی مجدد سیستم دستور زیر را برای دانلود دیتابیس در command prompt وارد کنید:
docker pull mongo
سپس یک پوشه جدید ایجاد کرده ( هر جایی که میخواید ) و با IDE یا Code Editor خودتون بازش کنین و یک فایل به اسم docker-compose.yml ایجاد کنید و دستورات زیر را در آن وارد کنید:
--(دیتابیس های مونگو روی با تنظیمات زیر روی کانتینر های داکر ایجاد میشن )
version: "3" services: mongo0: hostname: mongo0 container_name: mongo0 image: mongo:latest expose: - 30000 ports: - 30000:30000 volumes: - 'mongodb_repl_data1:/data/db:z' restart: always command: "--bind_ip_all --replSet rs0 --port 30000" mongo1: hostname: mongo1 container_name: mongo1 image: mongo:latest expose: - 30001 ports: - 30001:30001 volumes: - 'mongodb_repl_data2:/data/db:z' restart: always command: "--bind_ip_all --replSet rs0 --port 30001" mongo2: hostname: mongo2 container_name: mongo2 image: mongo:latest expose: - 30002 ports: - 30002:30002 volumes: - 'mongodb_repl_data3:/data/db:z' restart: always command: "--bind_ip_all --replSet rs0 --port 30002" volumes: mongodb_repl_data1: external: true mongodb_repl_data2: external: true mongodb_repl_data3: external: true
دستور زیر برای ساخت کانتینر های داکر و راه اندازی آنهاست:
docker-compose.exe up -d
سپس دستور زیر را برای اتصال به دیتابیس میزنیم:
docker exec -it mongo0 mongo --port 30000
سپس در shell باز شده دستور زیر برای ایجاد یک کانفیگ را وارد میکنیم:
config={"_id":"rs0","members":[{"_id":0,"host":"mongo0:30000"},{"_id":1,"host":"mongo1:30001"},{"_id":2,"host":"mongo2:30002"}]}
سپس به ادرس زیر رفته و مقادیر زیر را به فایل hosts اضافه کرده و آن را سیو کنید:
C:\Windows\System32\drivers\etc\hosts
127.0.0.1 mongo0 mongo1 mongo2
سپس دستور زیر را برای کانفیگ کردن replica set خود میزنیم:
rs.initiate(config);
دستور زیر را برای ایجاد یک دیتابیس جدید و ایجاد کاربر جدید با دسترسی readWrite وارد می کنیم:
use test
db.createUser({ "user": "nima", "pwd": "nima1234", roles: [ { "role": "readWrite", "db": "test" } ] })
خب تا اینجا ما تونستیم دیتابیس خودمون رو برای استفاده کانفیگ کنیم! از اینجا به بعد یک پروژه NestJs راه اندازی میکنیم و پریسما را به آن اضافه کرده و به دیتابیسی که راه اندازی کردیم متصل می کنیم.
دستور زیر را برای نصب NestJs وارد کنید:
npm i -g @nestjs/cli
برای ایجاد یک پروژه زیر دستور زیر را وارد کنید:
nest new project-name
سپس Prisma را با دستورات زیر به پروژه اضافه و راه اندازی کنید:
npm install prisma --save-dev
npx prisma init
سپس در فایل schema.prisma در پوشه پریسما مدل زیر را اضافه کرده و provider خود را به mongodb تغییر بدهید:
generator client { provider = "prisma-client-js" } datasource db { provider = "mongodb" url = env("DATABASE_URL") } model Post { id String @id @default(auto()) @map("_id") @db.ObjectId() title String body String }
سپس database url در فایل env را با توجه به یوزرنیم و پسوردی که در هنگام کانفیگ وارد کردید را به صورت زیر تغییر بدهید:
DATABASE_URL="mongodb://nima:nima1234@localhost:30000/test?replicaSet=rs0"
به منظور sync (همگام سازی) با دیتابیس دستور زیر را وارد کنید:
npx prisma db push
سپس یک ترمینال جدید باز کرده و دستور زیر را وارد کرده و مظابق زیر عمل کنید و یک rest api ایجاد کنید و Crud را برای آن ایجاد کنید:
nest g resource post
سپس Prisma Client را با دستور زیر به پروژه اضافه کنید:
npm install @prisma/client
سپس برای کانفیگ Prisma Client دستور زیر را وارد کرده تا سرویس prisma را ایجاد سپس کد زیر را وارد سرویس ایجاد شده کنید:
nest g s prisma
import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { await this.$connect(); } async enableShutdownHooks(app: INestApplication) { this.$on('beforeExit', async () => { await app.close(); }); }}
فایل create-post.dto.ts را مطابق زیر بدهید:
export class CreatePostDto { title: string; body: string; }
سپس در فایل post.service.ts متد create را مطابق زیر تغییر بدهید:
import { Injectable } from '@nestjs/common'; import { PrismaService } from 'src/prisma/prisma.service'; import { CreateTestDto } from './dto/create-test.dto'; @Injectable() export class TestService { constructor(private prisma: PrismaService) {} async create(createTestDto: CreateTestDto) { return await this.prisma.post.create({ data: createTestDto, }); }}
در نهایت prisma service را به ماژول post اضافه کنید:
import { Module } from '@nestjs/common'; import { TestService } from './test.service'; import { TestController } from './test.controller'; import { PrismaService } from 'src/prisma/prisma.service'; @Module({ controllers: [TestController], providers: [TestService, PrismaService], }) export class TestModule {}
برای اجرای پروژه در حالت development از دستور زیر استفاده کنین:
npm run start:dev
تبریک میگم این پروژه هم تموم شد! ??
الان میتونین پروژه رو ران کنین و ابزار هایی مثل postman و یا insomnia به سمت api ریکوئست بزنین!
ممنون میشم نظرات و سوالاتون رو برام بنویسید.