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، فيرفض خط الأنابيب هذا النوع من البيانات بدلًا من ذلك، مع الرمز 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

تدرّب بنفسك: Playground لـ Express