Menu
CoddyTech

שדות לא מוכרים

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

לקוח יכול לשלוח שדות שה־DTO שלך לא מזכיר, כמו { "title": "x", "admin": true }, והם מגיעים לקוד שלך ללא שינוי. ל־ValidationPipe יש שתי אפשרויות לטיפול בהם.

app.useGlobalPipes(
    new ValidationPipe({ whitelist: true }),
);

whitelist: true מסיר כל שדה שאין לו דקורטור אימות לפני שהמתודה שלך רואה את גוף הבקשה. הוסף forbidNonWhitelisted: true, וה־pipe ידחה גוף בקשה כזה במקום זאת, עם שגיאת 400 וההודעה "property admin should not exist". forbidNonWhitelisted פועל רק יחד עם whitelist; בפני עצמו הוא לא עושה דבר.

הסרה שקטה מתאימה לטופס ששולח קלטים נוספים. דחייה מאפשרת ללקוח API לדעת על שגיאת הקלדה, כמו titel.

challenge icon

אתגר

קל

לקוח יכול לשלוח שדות שה־DTO שלך אף פעם לא מזכיר, כמו "owner": "admin", וכרגע הם מגיעים לקוד שלך ללא שינוי. יש לגרום ל־API לדחות אותם, כדי שלקוח שטעה בהקלדה או הוסיף שדה חשוד יגלה זאת.

  1. ב־src/main.ts, מצא את ValidationPipe ש־bootstrap כבר רושמת. העבר לו שתי אפשרויות: whitelist: true, שמסירה כל שדה שאין לו מעצב אימות, ו־forbidNonWhitelisted: true, שדוחה גוף בקשה כזה עם קוד 400 במקום להסיר את השדה. האפשרות השנייה פועלת רק בשילוב עם הראשונה.
  2. אל תשנה שום דבר אחר. גופי בקשה שמכילים רק title ו־done ימשיכו לעבוד, וכותרת לא תקינה עדיין תידחה.

נסה זאת: שלח POST אל { "title": "Book flights", "owner": "admin" } ל־/tasks. תקבל קוד 400:

{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }

לאחר מכן שלח POST עם { "title": "Book flights" }: תקבל קוד 201 ואת המשימה החדשה. גם { "title": 7 } עדיין יקבל קוד 400.

נסו בעצמכם

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    app.useGlobalPipes(new ValidationPipe());
    await app.listen(3000);
}
bootstrap();
quiz iconבחנו את עצמכם

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

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

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