פרמטרים של נתיב
חלק מהיחידה TypeScript ו-NestJS במסלול ה-Node.js של Coddy. שיעור 4 מתוך 24.
לקוח זקוק לעיתים קרובות למשימה אחת, ולא לרשימה כולה. נתיב יכול להכיל פרמטר: חלק שמשתנה מבקשה לבקשה.
@Get(':isbn')
findOne(@Param('isbn') isbn: string) {
return this.books.find((book) => book.isbn === isbn);
}:isbn תואם לכל ערך במיקום הזה בנתיב, ולכן GET /books/978 מגיעה למתודה הזאת. @Param('isbn') מעביר את הערך הזה למתודה. הוא תמיד טקסט: /books/42 נותן את המחרוזת '42', ולא את המספר 42.
אם משמיטים את השם, @Param() נותן את האובייקט שמכיל את כל הפרמטרים, { isbn: '978' }, במקום את הערך.
אתגר
קללקוח רוצה לעיתים קרובות משימה אחת, ולא את כל הרשימה. הוסף נתיב שמחזיר משימה אחת לפי המזהה שלה.
- ב־
src/tasks/tasks.controller.ts, הוסף מתודה שנייה ל־TasksController(קרא להfindOne) עבורGET /tasks/:id.:idמציין כל ערך במיקום הזה בנתיב, ולכן/tasks/2מגיע אליו. - קרא את המזהה מהנתיב באמצעות
@Param('id'). ייבא אתParamמתוך@nestjs/common. - המזהה מתקבל כטקסט, כמו
"2", אבל המזהים ב־this.tasksהם מספרים, ו־"2" === 2הוא false. המר את המזהה למספר לפני ההשוואה. - החזר את המשימה שהמזהה שלה תואם.
- השאר את
GET /tasksכפי שהוא: הוא עדיין מחזיר את כל הרשימה.
נסה זאת: שלח GET /tasks/2. תקבל 200 ואת:
{ "id": 2, "title": "Fix the login bug", "done": false }שלח גם GET /tasks/1 וגם GET /tasks/3. לאחר מכן שלח GET /tasks/99. אין משימה עם המזהה הזה, ולכן המתודה שלך לא מחזירה דבר, ו־Nest מגיב ב־200 עם גוף ריק. זה צפוי בשלב הזה. כך הלקוח לא מקבל שום מידע, ושיעור מאוחר יותר יתקן זאת.
נסו בעצמכם
import { Controller, Get } 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()
findAll(): Task[] {
return this.tasks;
}
}
כל השיעורים ביחידה TypeScript ו-NestJS
1יסודות Nest
מחלקות ומתודותשלום, Nestרישום בקר4משמרים, מסננים ומיירטים
משמריםתרגלו בעצמכם: Express אונליין