שדות לא מוכרים
חלק מהיחידה 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.
אתגר
קללקוח יכול לשלוח שדות שה־DTO שלך אף פעם לא מזכיר, כמו "owner": "admin", וכרגע הם מגיעים לקוד שלך ללא שינוי. יש לגרום ל־API לדחות אותם, כדי שלקוח שטעה בהקלדה או הוסיף שדה חשוד יגלה זאת.
- ב־
src/main.ts, מצא אתValidationPipeש־bootstrapכבר רושמת. העבר לו שתי אפשרויות:whitelist: true, שמסירה כל שדה שאין לו מעצב אימות, ו־forbidNonWhitelisted: true, שדוחה גוף בקשה כזה עם קוד 400 במקום להסיר את השדה. האפשרות השנייה פועלת רק בשילוב עם הראשונה. - אל תשנה שום דבר אחר. גופי בקשה שמכילים רק
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();
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה TypeScript ו-NestJS
תרגלו בעצמכם: Express אונליין