فصل ششم: مسیرهای سرور (شبیهسازی API)
در این فصل، به پیادهسازی مسیرهای سرور (Server Routes) در Nuxt 3 برای شبیهسازی APIهای بکاند در اپلیکیشن مرکز اجاره کشتیهای کروز میپردازیم. Nuxt 3 با استفاده از موتور Nitro امکان ایجاد APIهای سمت سرور را بهصورت داخلی فراهم میکند، که برای مدیریت دادهها بدون نیاز به سرور جداگانه بسیار کاربردی است. در این پروژه، ما دو مسیر API ایجاد میکنیم: یکی برای دریافت لیست کشتیها و دیگری برای مدیریت رزروها. این APIها بهصورت موقت دادهها را در حافظه ذخیره میکنند، اما در پروژههای واقعی میتوانند به پایگاه دادهای مانند Supabase یا Prisma متصل شوند. در ادامه، هر مسیر API بهطور کامل توضیح داده شده و کدهای مربوطه شرح داده میشوند.
API کشتیها (server/api/ships.ts)
این مسیر API وظیفه ارائه لیست کشتیهای کروز را بر عهده دارد و بهعنوان یک منبع داده برای صفحه لیست کشتیها و جزئیات کشتی عمل میکند.
کد:
// server/api/ships.ts
import type { Ship } from '~/types';
export default defineEventHandler((): Ship[] => {
return [
{ id: 1, name: 'Ocean Explorer', capacity: 500, pricePerDay: 10000, amenities: ['Pool', 'Gym'], image: '/images/ocean.jpg' },
{ id: 2, name: 'Luxury Liner', capacity: 1000, pricePerDay: 20000, amenities: ['Spa', 'Theater'], image: '/images/luxury.jpg' },
];
});
توضیحات:
-
وارد کردن تایپ Ship:
-
import type { Ship } from '~/types': تایپShipاز فایلtypes/index.tsوارد شده است تا اطمینان حاصل شود که دادههای بازگشتی با مدل دادهShip(شامل فیلدهایid,name,capacity,pricePerDay,amenities, وimage) مطابقت دارند. این کار ایمنی نوع را در TypeScript تضمین میکند. -
تعریف مسیر:
-
defineEventHandler((): Ship[] => {...}): از تابعdefineEventHandlerکه بخشی از موتور Nitro در Nuxt 3 است، برای تعریف یک مسیر API استفاده شده است. - این مسیر بهصورت پیشفرض به درخواستهای GET در آدرس
/api/shipsپاسخ میدهد. -
نوع بازگشتی بهصورت آرایهای از
Shipتعریف شده است (Ship[]). -
دادههای موقت:
-
این مسیر یک آرایه ثابت از دو کشتی نمونه را برمیگرداند:
- کشتی اول: Ocean Explorer با ظرفیت ۵۰۰ نفر، قیمت روزانه ۱۰,۰۰۰ دلار، امکانات استخر و باشگاه، و تصویر
/images/ocean.jpg. - کشتی دوم: Luxury Liner با ظرفیت ۱,۰۰۰ نفر، قیمت روزانه ۲۰,۰۰۰ دلار، امکانات اسپا و تئاتر، و تصویر
/images/luxury.jpg.
- کشتی اول: Ocean Explorer با ظرفیت ۵۰۰ نفر، قیمت روزانه ۱۰,۰۰۰ دلار، امکانات استخر و باشگاه، و تصویر
-
مسیرهای تصویر (
/images/ocean.jpgو/images/luxury.jpg) به پوشهpublic/اشاره دارند، جایی که تصاویر باید ذخیره شوند. -
کاربرد:
-
این API توسط store کشتیها (
useShipsStore) در متدfetchShipsفراخوانی میشود تا دادههای کشتیها را برای نمایش در صفحه لیست کشتیها (pages/ships/index.vue) و صفحه جزئیات کشتی (pages/ships/[id].vue) فراهم کند. -
در یک پروژه واقعی، این دادهها میتوانند از یک پایگاه داده (مانند MongoDB یا PostgreSQL) دریافت شوند.
-
مزایا:
-
سادگی: این API نیازی به سرور جداگانه ندارد و مستقیماً در پروژه Nuxt اجرا میشود.
- انعطافپذیری: میتوان بهراحتی آن را به یک پایگاه داده واقعی متصل کرد.
- ایمنی نوع: استفاده از TypeScript اطمینان میدهد که دادههای بازگشتی با مدل
Shipسازگار هستند.
API رزروها (server/api/bookings.ts)
این مسیر API برای مدیریت رزروهای کاربران طراحی شده است و از درخواستهای GET (برای دریافت رزروها) و POST (برای افزودن رزرو جدید) پشتیبانی میکند.
کد:
// server/api/bookings.ts
import type { Booking } from '~/types';
let bookings: Booking[] = [];
export default defineEventHandler({
async get() {
return bookings;
},
async post(event) {
const body = await readBody(event);
const newBooking: Booking = {
id: bookings.length + 1,
shipId: body.shipId,
startDate: new Date(body.startDate),
endDate: new Date(body.endDate),
totalPrice: body.totalPrice,
};
bookings.push(newBooking);
return newBooking;
},
});
توضیحات:
-
وارد کردن تایپ Booking:
-
import type { Booking } from '~/types': تایپBookingاز فایلtypes/index.tsوارد شده است تا دادههای رزرو با مدلBooking(شامل فیلدهایid,shipId,startDate,endDate, وtotalPrice) مطابقت داشته باشند. -
ذخیرهسازی موقت:
-
let bookings: Booking[] = []: آرایهای برای ذخیره رزروها در حافظه تعریف شده است. این دادهها با هر بار راهاندازی مجدد سرور پاک میشوند (در پروژه واقعی، باید از پایگاه داده استفاده شود). -
تعریف مسیر:
-
defineEventHandler({...}): یک مسیر API چندمنظوره تعریف میکند که به درخواستهای GET و POST در آدرس/api/bookingsپاسخ میدهد. -
متد GET:
-
async get(): این متد تمام رزروهای موجود در آرایهbookingsرا برمیگرداند. -
کاربرد: توسط store رزروها (
useBookingsStore) در متدfetchBookingsبرای نمایش رزروها در داشبورد رزروها (pages/bookings.vue) استفاده میشود. -
متد POST:
-
async post(event): این متد یک رزرو جدید را از بدنه درخواست (Request Body) دریافت کرده و به آرایهbookingsاضافه میکند. const body = await readBody(event): بدنه درخواست را میخواند که شاملshipId,startDate,endDate, وtotalPriceاست.const newBooking: Booking: یک شیء رزرو جدید ایجاد میکند:id: بهصورت خودکار با افزایش تعداد رزروهای موجود (bookings.length + 1) تولید میشود.- سایر فیلدها (
shipId,startDate,endDate,totalPrice) از بدنه درخواست گرفته شده وstartDateوendDateبه شیءDateتبدیل میشوند.
bookings.push(newBooking): رزرو جدید به آرایه اضافه میشود.return newBooking: رزرو جدید بهعنوان پاسخ به کلاینت ارسال میشود.-
کاربرد: توسط store رزروها در متد
addBookingهنگام ارسال فرم رزرو در صفحه جزئیات کشتی (pages/ships/[id].vue) فراخوانی میشود. -
کاربرد:
-
این API امکان افزودن رزروهای جدید و دریافت لیست رزروها را فراهم میکند.
-
در پروژه واقعی، میتوان آن را به یک پایگاه داده متصل کرد تا رزروها بهصورت دائمی ذخیره شوند.
-
مزایا:
-
یکپارچگی با Nuxt: نیازی به سرور جداگانه نیست و Nitro اجرای سریع و کارآمد را تضمین میکند.
- پشتیبانی از چندین متد HTTP: این مسیر بهراحتی از GET و POST پشتیبانی میکند و میتوان متدهای دیگر (مانند PUT یا DELETE) را به آن اضافه کرد.
- ایمنی نوع: استفاده از تایپ
Bookingاز خطاهای دادهای جلوگیری میکند.
نکات تکمیلی
- شبیهسازی در مقابل تولید: در این پروژه، دادهها بهصورت موقت در حافظه ذخیره میشوند. برای پروژههای واقعی، باید این APIها را به یک پایگاه داده مانند Supabase، MongoDB یا PostgreSQL متصل کنید. برای مثال، میتوانید از ماژول
@nuxtjs/supabaseبرای اتصال به Supabase استفاده کنید. - مقیاسپذیری: ساختار مسیرهای سرور Nuxt امکان افزودن منطق پیچیدهتر (مانند احراز هویت یا اعتبارسنجی داده) را فراهم میکند.
- بهینهسازی: Nitro بهطور خودکار پاسخها را فشردهسازی کرده و عملکرد را بهبود میبخشد.
جمعبندی فصل ششم
در این فصل، دو مسیر API برای اپلیکیشن مرکز اجاره کشتیهای کروز پیادهسازی کردیم:
- API کشتیها (
/api/ships): لیستی از کشتیها را برای نمایش در رابط کاربری فراهم میکند. - API رزروها (
/api/bookings): امکان دریافت و افزودن رزروها را مدیریت میکند.
این مسیرها با استفاده از موتور Nitro و TypeScript پیادهسازی شدهاند تا ایمن، کارآمد و قابل گسترش باشند. در فصلهای بعدی، به ویژگیهای پیشرفتهتر مانند میدلورها و بهینهسازیهای Nuxt خواهیم پرداخت.