الحقول غير المعروفة
جزء من قسم TypeScript وNestJS في رحلة Node.js على Coddy. الدرس 16 من 24.
يمكن للعميل إرسال حقول لا يذكرها DTO مطلقًا، مثل { "title": "x", "admin": true }، وستصل إلى الشيفرة كما هي دون تغيير. يحتوي ValidationPipe على خيارين للتعامل معها.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);يزيل whitelist: true كل حقل لا يحمل مُزخرف تحقق قبل أن تصل البيانات إلى طريقتك. أضف forbidNonWhitelisted: true، فيرفض خط الأنابيب هذا النوع من البيانات بدلًا من ذلك، مع الرمز 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
تدرّب بنفسك: Playground لـ Express