خدمة
جزء من قسم TypeScript وNestJS في رحلة Node.js على Coddy. الدرس 6 من 17.
وحدة التحكم تحتفظ بالمهام نفسها، لذا لا يمكن لأي جزء آخر من التطبيق الوصول إليها. مكان البيانات والمنطق هو موفّر: صنف تنشئه Nest وتسلمه إلى من يطلبه.
@Injectable()
export class BooksService {
private books = [{ title: 'Dune' }];
}
@Controller('books')
export class BooksController {
constructor(private readonly booksService: BooksService) {}
}تُعلِّم @Injectable() الصنف، وتدرجه الوحدة في providers. يطلب الصنف هذا الموفّر بذكر اسمه في المُنشئ: وهذا هو حقن التبعية. تقرأ Nest نوع المعامل، الذي يحتفظ به المترجم للأصناف المزخرفة، وتنشئ نسخة واحدة للتطبيق كله وتمرر النسخة نفسها إلى كل صنف يطلبها. وتكون البيانات مشتركة، ويمكن للاختبار أن يمرر بديلًا وهميًا بدلًا منها.
يبدأ هذا الدرس بوحدة التحكم وهي تستدعي this.tasksService بالفعل.
التحدي
سهل- اجعل
TasksServiceقابلةً للحقن، وأضف إليهاcreate(title)وremove(id)، وهما العمل الذي أنجزته وحدة التحكم في الدرس 5، ثم أدرجها ضمنprovidersفيTasksModule. - اطلبها في مُنشئ
TasksController. - أرسل
POST /tasksمع{ "title": "Buy milk" }، ثمGET /tasks، ثمDELETE /tasks/99.
جرّب بنفسك
import { NotFoundException } from '@nestjs/common';
export interface Task {
id: number;
title: string;
done: boolean;
createdAt?: string;
}
// اجعل هذه الفئة مزوّدًا يمكن لـ Nest حقنه.
export class TasksService {
private tasks: Task[] = [
{ id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
{ id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
{ id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
];
findAll(done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
findOne(id: number): Task {
const task = this.tasks.find((task) => task.id === id);
if (!task) {
throw new NotFoundException(`Task ${id} not found`);
}
return task;
}
// انقل منطق الإنشاء والحذف من المتحكّم إلى هنا.
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.