آموزش ساخت REST API با Prisma و PostgreSQL
در این مقاله میخوانید
- پیشنیازهای ساخت REST API
- مراحل ساخت REST API با Prisma و PostgreSQL
- مرحله اول. ایجاد TypeScript Project
- مرحله دوم. راهاندازی Prisma با استفاده از PostgreSQL
- مرحله سوم. تعریف Data Model و ایجاد Database Tables
- مرحله چهارم. کاوش کوئریهای Prisma Client در اسکریپتی ساده
- مرحله پنجم. اجرای اولین مسیر REST API
- مرحله ششم. اجرای مسیرهای باقیمانده REST API
- نتیجهگیری
- سؤالات متداول
چگونه میتوان REST API را با Prisma و PostgreSQL ایجاد کرد؟ Prisma نوعی ORM متنباز برای Node.js و TypeScript بهشمار میرود که از سه ابزار اصلی تشکیل شده است:
- Prisma Client: سازنده خودکار و ایمن برای ساخت کوئری
- Prisma Migrate: سیستم قدرتمند برای مدلسازی و Migration دادهها
- Prisma Studio: رابط کاربری گرافیکی برای مشاهده و ویرایش دادهها در دیتابیس
هدف این ابزار افزایش بهرهوری توسعهدهندگان در دیتابیس است. یکی از مزایای مهم Prisma سطح انتزاعیای است که ارائه میکند؛ یعنی توسعهدهندگان و برنامهنویسان بهجای کشف کوئریهای پیچیده SQL یا Schema Migrations، میتوانند هنگام استفاده از Prisma اطلاعاتشان را به روشی شهودیتر استدلال کنند.
در این مقاله، نحوه ساخت REST API برای برنامه وبلاگنویسی کوچک در TypeScript را با استفاده از Prisma و PostgreSQL آموزش خواهیم داد. برای این کار ابتدا پایگاهداده PostgreSQL خود را بهصورت لوکال با Docker راهاندازی و مسیرهای REST API را با استفاده از Express اجرا کنید. در پایان آموزش، شما وبسروری لوکال روی دستگاه خود خواهید داشت که به درخواستهای مختلف HTTP میتواند پاسخ دهد و دادهها را در دیتابیس بخواند و بنویسد.
پیشنیازهای ساخت REST API
برای ساخت REST API با Prisma و PostgreSQL این پیشنیازها لازم است:
- باید Node.js نسخه ۱۰ یا جدیدتر را روی سیستمتان نصب کرده باشید. برای نصب و راهاندازی این پلتفرم، میتوانید به مقاله آموزش نحوه نصب Node.js در وبلاگ پارس پک مراجعه کنید.
- برای نصب اجرای دیتابیس PostgreSQL، به نصب Docker نیاز دارید.
مراحل ساخت REST API با Prisma و PostgreSQL
ساخت REST API با استفاده از Prisma و PostgreSQL آسان و فقط کافی است که مراحل زیر را بهترتیب دنبال کنید.
مقالهی زیر راهنمای کاملی است از چیستی API، انواع، پروتکلها و… و برای درک بهتر مفهوم API توصیه میشود.
مرحله اول. ایجاد TypeScript Project
در مرحله اول، با استفاده از npm باید پروژه TypeScript ایجاد و راهاندازی کنید. این پروژه اساس REST API است که در این آموزش میخواهید ایجاد کنید. برای انجام این کار، نخست باید دایرکتوری جدیدی برای پروژه ایجاد کنید. برای ایجاد پروژه جدید، از کامند زیر استفاده کنید:
mkdir my-blog
اکنون به دایرکتوری بروید و پروژه خالی npm را برای شروع عملیات ایجاد کنید. توجه کنید گزینه y- بدینمعناست که از درخواست تعاملی صرفنظر میکنید؛ بههمیندلیل، برای اجرای این درخواستها باید گزینه y- را حذف کنید:
cd my-blog npm init -y
حال خروجی زیر را با پاسخهای پیشفرض دریافت خواهید کرد:
Output Wrote to /.../my-blog/package.json: { "name": "my-blog", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
این دستور فایل مینیمال package.json را ایجاد میکند که از آن بهعنوان فایل پیکربندی پروژه npm خود استفاده خواهید کرد. اکنون آماده پیکربندی TypeScript در پروژه خود هستید. دستور زیر را برای راهاندازی TypeScript استفاده کنید:
npm install typescript ts-node @types/node --save-dev
توجه کنید که سه دسته زیر بهعنوان وابستگیهای دولوپر در پروژه شما نصب میشوند:
- Typescript: ابزار TypeScript
- ts-node: پکیجی برای اجرای برنامههای TypeScript بدون کامپایل قبلی در جاوااسکریپت
- types/node@: تعریف نوع TypeScript برای Node.js
آخرین کار اضافهکردن فایل tsconfig.json است. برای این منظور، مطمئن شوید TypeScript بهدرستی برای برنامهای که میخواهید ایجاد کنید، پیکربندی شده است. ابتدا کامند زیر را برای ایجاد فایل اجرا کنید:
nano tsconfig.json
کد JSON زیر را به فایل اضافه کنید:
{ "compilerOptions": { "sourceMap": true, "outDir": "dist", "strict": true, "lib": ["esnext"], "esModuleInterop": true } }
درنهایت، فایل را ذخیره کنید و از آن خارج شوید. توجه کنید که این پیکربندیای استاندارد برای پروژه TypeScript است. اگر میخواهید درباره خصوصیات فایل پیکربندی اطلاعات کسب کنید، آنها را در اسناد TypeScript میتوانید جستوجو کنید.
اکنون پروژه TypeScript خود را با استفاده از npm راهاندازی کردهاید. در مرحله دوم، پایگاهداده PostgreSQL را باید با Docker تنظیم و Prisma را به آن متصل کنید.
مرحله دوم. راهاندازی Prisma با استفاده از PostgreSQL
در این مرحله، Prisma CLI را باید نصب و فایل Prisma Schema را ایجاد کنید. سپس PostgreSQL را با استفاده از Docker راهاندازی و Prisma را به آن متصل کنید. دقت کنید Prisma Schema فایل پیکربندی اصلی برای راهاندازی Prisma و شامل Database schema شماست.
برای آشنایی کاملتر با PostgreSQL و نحوه نصب آن مقالهی زیر را بخوانید.
پایگاه داده پستگرس ( PostgreSQL ) چیست و چگونه آن را نصب کنیم؟
با دستور زیر، نصب Prisma CLI را شروع کنید:
npm install @prisma/cli --save-dev
بهعنوان بهترین روش، توصیه میکنیم install the Prisma CLI locally را برای پروژهتان نصب کنید (برخلاف نصب جهانی). با انجام این کار، اگر بیش از یک پروژه Prisma روی دستگاه خود داشته باشید، از تضاد نسخه جلوگیری میکنید. در مرحله بعد، دیتابیس PostgreSQL خود را با استفاده از Docker تنظیم کنید. برای انجام این کار، باید نخست با استفاده از کامند زیر فایل Docker Compose جدیدی ایجاد کنید:
nano docker-compose.yml
حالا کد زیر را به فایل جدید ایجادشده اضافه کنید:
version: '3.8' services: postgres: image: postgres:10.3 restart: always environment: - POSTGRES_USER=sammy - POSTGRES_PASSWORD=your_password volumes: - postgres:/var/lib/postgresql/data ports: - '5432:5432' volumes: postgres:
این فایل Docker Compose پایگاهداده PostgreSQL را پیکربندی میکند که ازطریق پورت 5432 کانتینر داکر دردسترس است. همچنین، توجه کنید که اعتبار دیتابیس درحالحاضر بهصورت sammy (user) و your_password (password) تنظیم شده است. این اعتبارنامهها را بهراحتی میتوانید با کاربر و رمزعبور دلخواهتان تنظیم کنید. در آخر، فایل را ذخیره کنید و از آن خارج شوید.
حال با این تنظیمات، پیش بروید و سرور دیتابیس PostgreSQL را با کامند زیر راهاندازی کنید:
docker-compose up -d
اکنون باید خروجی زیر را مشاهده کنید:
Output Pulling postgres (postgres:10.3)... 10.3: Pulling from library/postgres f2aa67a397c4: Pull complete 6de83ca23e55: Pull complete . . . Status: Downloaded newer image for postgres:10.3 Creating my-blog_postgres_1 ... done
با استفاده از فرمان زیر، میتوانید بررسی کنید که سرور دیتابیس در حال اجرا است یا خیر:
docker ps
سپس، خروجیای مشابه با خروجی زیر مشاهده خواهید کرد:
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8547f8e007ba postgres:10.3 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp my-blog_postgres_1
با اجراشدن سرور پایگاه داده، امکان ایجاد تنظیمات Prisma فراهم میشود، برای این منظور دستور زیر را از Prisma CLI اجرا کنید:
npx prisma init
با انجام این کار، خروجی زیر نمایش داده خواهد شد:
Output ✔ Your Prisma schema was created at prisma/schema.prisma. You can now open it in your favorite editor.
توجه کنید که بهعنوان بهترین روش، باید همه فراخوانهای Prisma CLI را با npx پیشوند کنید. این کار تضمین میکند که از نصب لوکال شما استفاده میشود. پس از اجرای کامند، Prisma CLI پوشه جدیدی به نام prisma در پروژه شما ایجاد میکند. این پوشه شامل دو فایل زیر است:
- schema.prisma: فایل پیکربندی اصلی پروژه Prisma (شامل مدل داده)
- env.: فایل dotenv برای تعریف URL اتصال دیتابیس
برای اطمینان از اینکه Prisma از مکان دیتابیس اطلاع دارد، باید فایل env. را باز و متغیر محیطی DATABASE_URL را تنظیم کنید. ابتدا با استفاده از کامند زیر فایل env. را باز کنید:
$ nano prisma/.env
اکنون، میتوانید متغیر محیطی (Environment Variable) را بهصورت زیر تنظیم کنید:
DATABASE_URL="postgresql://sammy:your_password@localhost:5432/my-blog?schema=public"
مطمئن شوید که اعتبار پایگاهداده (Database Credentials) را به مواردی تغییر دادهاید که در فایل Docker Compose مشخص کردهاید. پس از اتمام کار، فایل را ذخیره کنید و از آن خارج شوید.
در این مرحله، پایگاهداده PostgreSQL خود را با استفاده از Docker تنظیم و Prisma CLI را نصب و Prisma را ازطریق متغیری محیطی به پایگاهداده متصل کردید. در بخش بعدی، باید مدل داده خود را تعریف و جداول دیتابیس را ایجاد کنید.
مرحله سوم. تعریف Data Model و ایجاد Database Tables
در این مرحله، مدل داده خود را در فایل Prisma Schema باید تعریف کنید. سپس، این مدل داده با Prisma Migrate به پایگاهداده نگاشت میشود که دستورهای SQL را برای ایجاد جداول مطابق با مدل داده شما تولید و ارسال میکند. ازآنجاکه در حال ساخت برنامه وبلاگنویسی هستید، موجودیتهای اصلی برنامه کاربرها و پستها خواهند بود.
Prisma از زبان مدلسازی داده خود برای تعریف شکل دادههای برنامه شما استفاده میکند. ابتدا فایل schema.prisma خود را با کامند زیر باز کنید:
nano prisma/schema.prisma
حال تعاریف مدل زیر را به آن اضافه کنید. مدلها را در پایین فایل، درست بعد از بلوک generator client میتوانید قرار دهید.
. . . model User { id Int @default(autoincrement()) @id email String @unique name String? posts Post[] } model Post { id Int @default(autoincrement()) @id title String content String? published Boolean @default(false) author User? @relation(fields: [authorId], references: [id]) authorId Int? }
فایل را ذخیره کنید و از آن خارج شوید. شما دو مدل به نامهای User و Post تعریف کنید. هریک از اینها تعدادی فیلد دارند که ویژگیهای مدل را نشان میدهند. مدلها به جداول پایگاهداده نگاشت میشوند و فیلدها نشاندهنده ستونهای جداگانه هستند.
همچنین توجه کنید که رابطهای یک به چند بین این دو مدل وجود دارد که فیلدهای مرتبط posts و author آن را روی User و Post مشخص کردهاند. این یعنی یک کاربر میتواند به بسیاری از پستها مرتبط شود. با وجود این مدلها، اکنون میتوانید جداول مرتبط را در پایگاهداده با استفاده از Prisma Migrate ایجاد کنید. برای این کار در ترمینال خود کامند زیر را اجرا کنید:
$ npx prisma migrate dev --name "init" --preview-feature
این دستور SQL Migration جدیدی در فایل سیستم ایجاد و آن را به پایگاهداده ارسال میکند. درادامه، شما را با دو گزینه ارائهشده در دستور آشنا میکنیم:
- “name “init–: نام Migration را مشخص میکند (برای نامگذاری فایل Migration ایجادشده در سیستم فایل شما استفاده میشود).
- preview-feature–: وجود آن ضروری است؛ زیرا Prisma Migrate در Preview قرار دارد.
خروجی این دستور مشابه زیر است:
Output Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource "db": PostgreSQL database "my-blog", schema "public" at "localhost:5432" PostgreSQL database my-blog created at localhost:5432 The following migration(s) have been created and applied from new schema changes: migrations/ └─ 20201209084626_init/ └─ migration.sql Running generate... (Use --skip-generate to skip the generators) ✔ Generated Prisma Client (2.13.0) to ./node_modules/@prisma/client in 75ms
فایل SQL migration در دایرکتوری prisma/migrations/20201209084626_init/migration.sql عبارات زیر را شامل میشود که در دیتابیس اجرا شده است:
-- CreateTable CREATE TABLE "User" ( "id" SERIAL, "email" TEXT NOT NULL, "name" TEXT, PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "Post" ( "id" SERIAL, "title" TEXT NOT NULL, "content" TEXT, "published" BOOLEAN NOT NULL DEFAULT false, "authorId" INTEGER, PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); -- AddForeignKey ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
توجه کنید که اگر گزینه create-only– را به کامند prisma migrate dev اضافه کنید، فایل SQL migration تولیدشده را نیز میتوانید سفارشیسازی کنید.
در این مرحله، مدل داده خود را در Prisma Schema تعریف و جداول پایگاهداده مرتبط را با Prisma Migrate ایجاد کردید. در مرحله بعد، Prisma Client را در پروژهتان نصب خواهید کرد تا بتوانید دیتابیس را کوئری کنید.
برای آشنایی کامل با ویژگیها و کاربردهای کیت توسعه نرمافزار مقالهی زیر را بخوانید.
مرحله چهارم. کاوش کوئریهای Prisma Client در اسکریپتی ساده
Prisma Client سازنده کوئری بهصورت خودکار و ایمن است که از آن میتوانید برای خواندن و نوشتن دادههای برنامهنویسی در دیتابیس برنامه Node.js یا TypeScript استفاده کنید. از Prisma Client برای دسترسی به پایگاهداده در مسیرهای REST API خود، جایگزینی ORMهای سنتی، کوئری ساده SQL، لایههای دسترسی به دادههای سفارشی یا هر روش دیگری برای مکالمه با پایگاهداده میتوانید بهره ببرید.
در این مرحله، با نحوه نصب Prisma Client و کوئریهایی آشنا میشوید که با آن میتوانید ارسال کنید. قبل از اجرای مسیرها برای REST API خود در مراحل بعدی، ابتدا برخی از کوئریهای Prisma Client را در اسکریپتی ساده و اجراشدنی بررسی کنید.
ابتدا با بازکردن ترمینال و نصب پکیج npm Prisma Client در پروژه خود، Prisma Client را نصب کنید:
npm install @prisma/client
سپس، دایرکتوری جدیدی به نام src ایجاد کنید که حاوی فایلهای منبع شما باشد:
mkdir src
حالا فایل TypeScript در داخل دایرکتوری جدید ایجاد کنید:
nano src/index.ts
تمامی کوئریهای Prisma Client عباراتی را برمیگردانند که میتوانید در کد خود await کنید. برای این کار، باید کوئریها را داخل تابع async ارسال کنید. سپس، boilerplate زیر را همراه با تابع async اضافه کنید که در اسکریپت شما اجرا شده است:
import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { // ... your Prisma Client queries will go here } main() .catch((e) => console.error(e)) .finally(async () => await prisma.disconnect())
درادامه، بهاختصار اجزای boilerplate را مرور خواهیم کرد:
1. سازنده PrismaClient را از پکیج npm@prisma/client که قبلاً نصب شده، وارد کنید.
2. PrismaClient را با فراخوانی سازنده نمونهسازی کنید و نمونهای به نام prisma بهدست آورید.
3. تابع async به نام main را تعریف و در آن عبارت Prisma Client را اضافه کنید.
4. تابع main را فراخوانی کنید. درحالیکه هرگونه استثنای احتمالی را در نظر میگیرید، مطمئن شوید که Prisma Client هرگونه اتصال دیتابیس باز را با فراخوانی prisma.disconnect میبندد.
با قراردادن تابع main، کوئریهای Prisma Client را به اسکریپت میتوانید اضافه کنید. سپس، index.ts را بهشکل زیر تنظیم کنید:
import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { const newUser = await prisma.user.create({ data: { name: 'Alice', email: '[email protected]', posts: { create: { title: 'Hello World', }, }, }, }) console.log('Created new user: ', newUser) const allUsers = await prisma.user.findMany({ include: { posts: true }, }) console.log('All users: ') console.dir(allUsers, { depth: null }) } main() .catch((e) => console.error(e)) .finally(async () => await prisma.disconnect())
در این کد، از دو کوئری استفاده میکنید:
- create: رکورد User جدیدی ایجاد میکند. توجه کنید که درواقع از nested write استفاده میکنید؛ یعنی هر دو رکورد User و Post را در یک کوئری ایجاد میکنید.
- findMany: تمام رکوردهای User موجود را از پایگاهداده میخواند. شما گزینه include را ارائه میدهید که علاوهبرآن رکورد Post مربوط را برای هر رکورد User بارگذاری میکند. حالا اسکریپت را با کامند زیر اجرا کنید:
npx ts-node src/index.ts
درنهایت، خروجی زیر را در ترمینال خود دریافت خواهید کرد:
Output Created new user: { id: 1, email: '[email protected]', name: 'Alice' } [ { id: 1, email: '[email protected]', name: 'Alice', posts: [ { id: 1, title: 'Hello World', content: null, published: false, authorId: 1 } ] }
نکته: اگر از رابط کاربری گرافیکی دیتابیس استفاده میکنید، با مشاهده جداول User و Post میتوانید تأیید کنید که دادهها ایجاد شدهاند. همچنین، با اجرای npx prisma studio دادهها را در Prisma Studio میتوانید جستوجو کنید.
اکنون از Prisma Client برای خواندن و نوشتن دادهها در دیتابیس خود استفاده کردهاید. در مراحل بعدی، روش جدیدی برای اجرای مسیرهای REST API بهکار خواهید برد. پس همچنان با ما همراه باشید.
مرحله پنجم. اجرای اولین مسیر REST API
در این مرحله، ابتدا باید Express را در برنامه خود نصب کنید. Express چهارچوب محبوب وب برای Node.js است که از آن برای اجرای مسیرهای REST API استفاده میشود. اولین مسیری که اجرا میکنید، به شما امکان میدهد که با استفاده از درخواست GET، همه کاربران را از API منتقل کنید. دادههای کاربر با استفاده از Prisma Client از پایگاهداده بازیابی میشوند.
نخست Express را با استفاده از دستور زیر نصب کنید:
npm install express
ازآنجاکه از TypeScript استفاده میکنید و میخواهید موارد مرتبط را بهعنوان development dependencies نصب کنید، باید دستور زیر را بهکار ببرید:
npm install @types/express --save-dev
با وجود وابستگیها، میتوانید برنامه Express خود را راهاندازی کنید. این کار را با بازکردن مجدد فایل منبع اصلی خود شروع کنید:
nano src/index.ts
حالا تمام کدهای موجود در index.ts را حذف و کد زیر را جایگزین کنید تا REST API خود را شروع کنید:
import { PrismaClient } from '@prisma/client' import express from 'express' const prisma = new PrismaClient() const app = express() app.use(express.json()) // ... your REST API routes will go here app.listen(3000, () => console.log('REST API server ready at: http://localhost:3000'), )
درادامه، شما را با این کدها آشنا خواهیم کرد:
1. PrismaClient و Express را از پکیجهای مربوط به npm وارد کنید.
2. PrismaClient را با فراخوانی سازنده نمونهسازی کنید و نمونهای به نام prisma بهدست آورید.
3. برنامه Express خود را با فراخوانی ()express ایجاد کنید.
4. با اضافهکردن ()express.json میتوانید مطمئن شوید که Express دادههای JSON را بهدرستی پردازش میشود.
5. سرور را روی پورت 3000 راهاندازی کنید.
اکنون، میتوانید اولین مسیر خود را پیادهسازی کنید. بین تماسهای app.use و app.listen، کد زیر را اضافه کنید:
. . . app.use(express.json()) app.get('/users', async (req, res) => { const users = await prisma.user.findMany() res.json(users) }) app.listen(3000, () => console.log('REST API server ready at: http://localhost:3000'), )
پس از اضافهشدن، فایلتان را ذخیره کنید و از آن خارج شوید. سپس، وبسرور لوکال خود را با استفاده از دستور زیر اجرا کنید:
npx ts-node src/index.ts
اکنون، خروجی زیر را دریافت خواهید کرد:
Output REST API server ready at: http://localhost:3000
برای دسترسی به مسیر users/، میتوانید مرورگر خود را به http://localhost:3000/users یا هر کلاینت HTTP دیگری هدایت کنید.
نکته: اگر ترجیح میدهید از کلاینت HTTP مبتنیبر رابط کاربری گرافیکی استفاده کنید، از جایگزینهایی مانند Postwoman یا Advanced REST Client میتوانید بهره ببرید.
برای تست مسیر خود، پنجره یا برگه ترمینال جدیدی باز کنید؛ بهطوریکه وبسرور محلی شما بتواند به کار خود ادامه دهد. درادامه، دستور زیر را اجرا کنید:
curl http://localhost:3000/users
حالا دادههای کاربریای که در مرحله قبل ایجاد کردهاید، دریافت خواهید کرد:
Output [{"id":1,"email":"[email protected]","name":"Alice"}]
توجه کنید که از آرایه posts استفاده نشده است؛ زیرا در اجرای مسیر users/، گزینه include را به فراخوان findMany منتقل نمیکنید.
اکنون اولین مسیر REST API خود را در users/ پیادهسازی کردهاید. در مرحله بعدی، مسیرهای باقیمانده REST API را برای اضافهکردن قابلیتهای بیشتر API خود پیادهسازی خواهید کرد.
مرحله ششم. اجرای مسیرهای باقیمانده REST API
در این مرحله، مسیرهای باقیمانده REST API را برای برنامه وبلاگنویسی خود پیادهسازی خواهید کرد. در پایان، وبسرور شما درخواستهای مختلف GET ،POST ،PUT و DELETE را ارائه میدهد. در جدول زیر، فهرست مسیرهای مختلف برای شما نمایش داده شده است:
توضیحات | روت | روش HTTP |
تمامی پستهای منتشرشده را دریافت میکند. | Feed/ | GET |
پست خاصی را با ID دریافت میکند. | post/:id/ | GET |
کاربری جدید ایجاد میکند. | User/ | POST |
پستی جدید ایجاد میکند. | Post/ | POST |
فیلد published روی true قرار میدهد. | post/publish/:id/ | PUT |
پستی را برحسب ID حذف میکند. | post/:id | DELETE |
اکنون، ابتدا مسیرهای GET باقیمانده را اجرا کنید. برای این کار، index.ts را با کامند زیر باز کنید:
nano src/index.ts
سپس، کد زیر را بهدنبال پیادهسازی مسیر users/ اضافه کنید:
. . . app.get('/feed', async (req, res) => { const posts = await prisma.post.findMany({ where: { published: true }, include: { author: true } }) res.json(posts) }) app.get(`/post/:id`, async (req, res) => { const { id } = req.params const post = await prisma.post.findOne({ where: { id: Number(id) }, }) res.json(post) }) app.listen(3000, () => console.log('REST API server ready at: http://localhost:3000'), )
فایل خود را ذخیره کنید و از آن خارج شوید. این کد مسیرهای API را برای دو درخواست GET پیادهسازی میکند:
- feed/: فهرستی از پستهای منتشرشده را برمیگرداند.
- post/:id/: پست خاصی را با ID آن برمیگرداند.
از Prisma Client در هر دو پیادهسازی استفاده میشود. در پیادهسازی مسیر feed/، کوئریای که با فیلترهای Prisma Client ارسال میکنید، برای تمام رکوردهای Post در ستون published حاوی مقدار true است. علاوهبراین، کوئری Prisma Client از include بهمنظور دریافت اطلاعات author برای هر پست برگشتی استفاده میکند. در پیادهسازی مسیر post/:id/، شناسهای را ارسال میکنید که از مسیر URL بازیابی شده است تا رکورد Post خاصی را از دیتابیس بخوانید.
با فشاردادن کلیدهای CTRL + C روی صفحهکلید، میتوانید سرور را متوقف کنید. سپس، سرور را با استفاده از کامند زیر مجدداً راهاندازی کنید:
npx ts-node src/index.ts
برای تست مسیر feed/، میتوانید از دستور curl زیر استفاده کنید:
curl http://localhost:3000/feed
توجه کنید ازآنجاکه هنوز هیچ پستی منتشر نشده، پاسخ آرایهای خالی است:
Output []
برای تست مسیر post/:id/، میتوانید از کامند curl زیر استفاده کنید:
curl http://localhost:3000/post/1
این کامند پستی را برمیگرداند که در ابتدا ایجاد کرده بودید:
Output {"id":1,"title":"Hello World","content":null,"published":false,"authorId":1}
سپس، دو مسیر POST را پیادهسازی کنید. کد زیر را بهدنبال اجرای سه مسیر GET به index.ts اضافه کنید:
. . . app.post(`/user`, async (req, res) => { const result = await prisma.user.create({ data: { ...req.body }, }) res.json(result) }) app.post(`/post`, async (req, res) => { const { title, content, authorEmail } = req.body const result = await prisma.post.create({ data: { title, content, published: false, author: { connect: { email: authorEmail } }, }, }) res.json(result) }) app.listen(3000, () => console.log('REST API server ready at: http://localhost:3000'), )
درنهایت، فایل خود را ذخیره کنید و از آن خارج شوید. این کد مسیرهای API را برای دو درخواست POST پیادهسازی میکند:
- user/: کاربری جدید در دیتابیس ایجاد میکند.
- post/: پستی جدید در دیتابیس ایجاد میکند.
مانند قبل، Prisma Client در هر دو پیادهسازی استفاده میشود. در پیادهسازی مسیر User/، مقادیر را از بدنه درخواست HTTP به کوئری Create در Prisma Client منتقل میکنید؛ اما مسیر post/ کمی بیشتر درگیر است. در اینجا نمیتوانید مستقیماً مقادیر را از بدنه درخواست HTTP منتقل کنید. درعوض، ابتدا باید آنها را بهصورت دستی استخراج و سپس آنها را به کوئری Prisma Client ارسال کنید. دلیل این امر آن است که ساختار JSON در بدنه درخواست با ساختار موردانتظار Prisma Client مطابقت ندارد؛ بنابراین، باید ساختار موردانتظار را بهصورت دستی ایجاد کنید.
با فشاردادن همزمان کلیدهای CTRL + C در صفحهکلید، سرور را متوقف و مسیرهای جدید را تست کنید. سپس، سرور را مجدداً با استفاده از فرمان زیر راهاندازی کنید:
npx ts-node src/index.ts
برای ایجاد کاربر جدید ازطریق مسیر User/، میتوانید درخواست POST زیر را با curl ارسال کنید:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Bob", "email":"[email protected]"}' http://localhost:3000/user
این کامند کاربر جدیدی در پایگاهداده ایجاد و خروجی زیر را چاپ میکند:
Output {"id":2,"email":"[email protected]","name":"Bob"}
درنهایت، مسیرهای PUT و DELETE را میتوانید پیادهسازی کنید. برای انجام این کار، index.ts را با کامند زیر باز کنید:
nano src/index.ts
پس از اجرای دو مسیر POST، کدهای هایلایتشده را اضافه کنید:
. . . app.put('/post/publish/:id', async (req, res) => { const { id } = req.params const post = await prisma.post.update({ where: { id: Number(id) }, data: { published: true }, }) res.json(post) }) app.delete(`/post/:id`, async (req, res) => { const { id } = req.params const post = await prisma.post.delete({ where: { id: Number(id) }, }) res.json(post) }) app.listen(3000, () => console.log('REST API server ready at: http://localhost:3000'), )
فایل خود را ذخیره کنید و از آن خارج شوید. این کد مسیرهای API را برای یک درخواست PUT و یک درخواست DELETE پیادهسازی میکند:
- post/publish/:id/: پستی را با ID خود منتشر میکند.
- post/:id/: پستی را با ID آن حذف میکند.
مجدداً از Prisma Client در هر دو پیادهسازی استفاده میشود. در پیادهسازی مسیر post/publish/:id/، آیدی پستی که قرار است منتشر شود، از URL بازیابی و به کوئری Update در Prisma Client ارسال میشود. پیادهسازی مسیر post/:id/ برای حذف پست در دیتابیس نیز آیدی پست را از URL بازیابی و آن را به کوئری Delete در Prisma Client ارسال میکند.
با فشاردادن همزمان کلیدهای CTRL + C در صفحهکلید، سرور را متوقف و سپس با استفاده از کامند زیر، مجدداً آن را راهاندازی کنید:
npx ts-node src/index.ts
مسیر PUT را میتوانید با دستور curl زیر تست کنید:
curl -X PUT http://localhost:3000/post/publish/2
این دستور پست را با مقدار آیدی 2 منتشر میکند. اگر درخواست feed/ را دوباره ارسال کنید، این پست اکنون در پاسخ گنجانده میشود. درنهایت، مسیر DELETE را با دستور curl زیر میتوانید تست کنید:
curl -X DELETE http://localhost:3000/post/1
با این کار، پستی با مقدار آیدی 1 حذف میشود. برای تأیید اینکه پست با این ID حذف شده است، درخواست GET را مجدداً به مسیر /post/1 میتوانید ارسال کنید.
در این مرحله، مسیرهای REST API باقیمانده را برای برنامه وبلاگنویسی خود پیادهسازی کردید. API اکنون به درخواستهای مختلف GET ،POST ،PUT و DELETE پاسخ میدهد و عملکردی را برای خواندن و نوشتن دادهها در پایگاهداده پیادهسازی میکند.
در مقالهی زیر سه سیستم مدیریت دیتابیس نسبی SQLite و MySQL و PostgreSQL بررسی و مقایسه شدهاند. آن را از دست ندهید.
نتیجهگیری
در این مقاله از وبلاگ پارس پک، شما را با مراحل ساخت REST API با استفاده از Prisma و PostgreSQL آشنا ساختیم. در استفاده از این مراحل، میتوانید مسیرهای مختلف را برای ایجاد، خواندن، بهروزرسانی و حذف دادههای کاربر و پست برای نمونه برنامه وبلاگنویسی ایجاد کنید. امیدواریم که این آموزش نیز برایتان مفید بوده باشد. شما میتوانید سؤالات خود را درباره نحوه ساخت REST API با کارشناسان پارس پک بهاشتراک بگذارید تا در سریعترین زمان ممکن جوابگوی شما باشند.
سؤالات متداول
1. Prisma PostgreSQL چیست؟
Prisma نوعی ORM متنباز برای Node. Js و TypeScript است که شامل سه ابزار اصلی است:
- Prisma Client : سازنده خودکار و ایمن برای ساخت کوئری
- Prisma Migrate: سیستم قدرتمند برای مدلسازی و Migration دادهها
- Prisma Studio : رابط کاربری گرافیکی برای مشاهده و ویرایش دادهها در دیتابیس
2. چگونه Prisma Schema ایجاد کنیم؟
بهعنوان اولین قدم، دایرکتوری پروژه ایجاد و در آن کامندهای زیر را اجرا کنید:
mkdir hello-prisma. $cd hello-prisma. ... npx prisma.
سپس در مرحله بعد، پروژه Prisma خود را با فایل Prisma Schema ایجاد و با کامند زیر تنظیم کنید:
npx prisma init.