Menu
CoddyTech

שלום, Nest

חלק מהיחידה TypeScript ו-NestJS במסלול ה-Node.js של Coddy. שיעור 2 מתוך 24.

ב-Express כל נתיב הוא פונקציה שרושמים ידנית. NestJS מעניק לכל חלק בממשק API מחלקה משלו, ודקורטורים אומרים ל-Nest מה עושה כל מחלקה.

@Controller('books')
export class BooksController {
    @Get()
    findAll() {
        return [{ title: 'Dune' }];
    }
}

בקר מטפל בבקשות עבור נתיב אחד. @Controller('books') ו-@Get() הם דקורטורים. דקורטור מתחיל ב-@ ומופיע בשורה שמעל מחלקה או מתודה, כדי לומר ל-Nest למה היא משמשת. הדקורטורים של Nest תמיד מסתיימים ב-(), גם כשלא מופיע בתוכם דבר. יחד הם ממפים את findAll אל GET /books, ו-Nest שולח את הערך שהמתודה מחזירה בתור JSON עם סטטוס 200. Nest לעולם לא שולח בקשה למתודה שאין לה דקורטור של נתיב.

מודול מציג את המחלקות ששייכות זו לזו. src/main.ts קורא ל-NestFactory.create(AppModule); AppModule מייבא את TasksModule, שמציג את TasksController. במחשב נייד היית מפעיל אותו באמצעות npm run start; כאן כפתור ההרצה עושה זאת.

בקוד ההתחלתי, interface Task מתאר את השדות של אובייקט משימה, ו-Task[] פירושו מערך של אובייקטים כאלה. private משאיר שדה בתוך המחלקה שלו. טיפוס שמופיע אחרי הסוגריים של מתודה מתאר את הערך שהיא מחזירה. ההצהרות האלה עוזרות ל-TypeScript לבדוק את הקוד שלך; הדקורטורים של Nest מגדירים את הנתיבים.

challenge icon

אתגר

קל

שרת Nest הראשון שלך כבר מכיל שלוש משימות, אבל עדיין אין נתיב שמחזיר אותן. הוסף את הנתיב שמציג אותן.

  1. פתח את src/tasks/tasks.controller.ts. המחלקה TasksController מחזיקה את הרשימה ב-this.tasks. @Controller('tasks') שמעל למחלקה מטיל עליה לטפל בנתיבים שמתחילים ב-/tasks.
  2. במקום שבו מופיעה ההערה, הוסף מתודה (קרא לה findAll) וסמן אותה ב-@Get(). היא מחזירה את this.tasks. Nest שולח את הערך שהמתודה מחזירה בתור JSON, עם קוד מצב 200.
  3. Get מגיע מ-@nestjs/common, כמו Controller. הוסף אותו לייבוא בשורה הראשונה.

נסה זאת: לחץ על "שחק", ואז שלח GET /tasks. תקבל 200 ואת שלוש המשימות:

[
  { "id": 1, "title": "Write the README", "done": true },
  { "id": 2, "title": "Fix the login bug", "done": false },
  { "id": 3, "title": "Plan the sprint", "done": false }
]

לאחר מכן שלח GET /task, בלי ה-s. אין נתיב שתואם לנתיב הזה, ולכן Nest משיב עם 404:

{ "message": "Cannot GET /task", "error": "Not Found", "statusCode": 404 }

נסו בעצמכם

import { Controller } from '@nestjs/common';

interface Task {
    id: number;
    title: string;
    done: boolean;
}

@Controller('tasks')
export class TasksController {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true },
        { id: 2, title: 'Fix the login bug', done: false },
        { id: 3, title: 'Plan the sprint', done: false },
    ];

    // הוסיפו כאן מתודה שמחזירה את הרשימה בתגובה לבקשת GET /tasks.
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה TypeScript ו-NestJS

תרגלו בעצמכם: Express אונליין