ค้นหาเว็บไซต์

javascript - วิธีการใช้การตรวจสอบความถูกต้องใน NestJs กับการแสดงผล HTML?


NestJS ใช้การตรวจสอบด้วยท่อการตรวจสอบและ

@UsePipes(ValidationPipe)

ถ้านี่ล้มเหลว มันจะโยนข้อยกเว้น ซึ่งสิ่งนี้ใช้ได้กับ REST APIs ที่ส่งคืน JSON

จะตรวจสอบความถูกต้องของพารามิเตอร์เมื่อใช้การแสดงผล HTML และการคืนค่าอย่างไร

{ errors: ['First error'] }

ไปยังแม่แบบ hbs?

คำตอบ #1

คุณสามารถสร้าง Interceptor ที่เปลี่ยนข้อผิดพลาดการตรวจสอบให้เป็นการตอบกลับข้อผิดพลาด:

@Injectable()
export class ErrorsInterceptor implements NestInterceptor {
  intercept(
    context: ExecutionContext,
    call$: Observable<any>,
  ): Observable<any> {
    return call$.pipe(
        // Here you can map (or rethrow) errors
        catchError(err => ({errors: [err.message]}),
      ),
    );
  }
}

คุณสามารถใช้มันได้โดยการเพิ่ม @UseInterceptors(ErrorsInterceptor) ในตัวควบคุมของคุณหรือในเมธอดของมัน

คำตอบ #2

ฉันแทบจะบ้าไปแล้วพยายามหาวิธีแบบ "เหมือน Nest" ในการทำสิ่งนี้พร้อมกับยังคงรักษาระดับการปรับแต่งได้ และฉันคิดว่าสุดท้ายฉันก็เจอมันแล้ว ก่อนอื่น เราต้องการข้อผิดพลาดที่มีการอ้างอิงถึงข้อผิดพลาด class-validator ที่มีอยู่ ดังนั้นเราจึงสร้างคลาสข้อผิดพลาดแบบกำหนดเองดังนี้:

import { ValidationError } from 'class-validator';

export class ValidationFailedError extends Error {
  validationErrors: ValidationError[];
  target: any;

  constructor(validationErrors) {
    super();
    this.validationErrors = validationErrors;
    this.target = validationErrors[0].target
  }
}

(เรายังมีการอ้างอิงถึงคลาสที่เราพยายามตรวจสอบความถูกต้อง ดังนั้นเราจึงสามารถส่งกลับอ็อบเจ็กต์ของเราได้ตามความเหมาะสม)

จากนั้น ใน main.ts เราสามารถตั้งค่าโรงงานข้อยกเว้นแบบกำหนดเองได้ดังนี้:

  app.useGlobalPipes(
    new ValidationPipe({
      exceptionFactory: (validationErrors: ValidationError[] = []) => {
        return new ValidationFailedError(validationErrors);
      },
    }),
  );

ต่อไป เราจะสร้าง ExceptionFilter เพื่อจับข้อผิดพลาดที่กำหนดเองของเรา ดังนี้:

@Catch(ValidationFailedError)
export class ValidationExceptionFilter implements ExceptionFilter {
  view: string
  objectName: string

  constructor(view: string, objectName: string) {
    this.view = view;
    this.objectName = objectName;
  }

  async catch(exception: ValidationFailedError, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();

    response.render(this.view, {
      errors: exception.validationErrors,
      [this.objectName]: exception.target,
      url: request.url,
    });
  }
}

เรายังเพิ่มตัวเริ่มต้นด้วย ดังนั้นเราสามารถระบุได้ว่าจะแสดงมุมมองใดและชื่อของวัตถุคืออะไร เพื่อที่เราจะได้ตั้งค่าตัวกรองของเราบนเมธอดคอนโทรลเลอร์ได้ดังนี้:

  @Post(':postID')
  @UseFilters(new ValidationExceptionFilter('blog-posts/edit', 'blogPost'))
  @Redirect('/blog-posts', 301)
  async update(
    @Param('id') postID: string,
    @Body() editBlogPostDto: EditBlogPostDto,
  ) {
    await this.blogPostsService.update(postID, editBlogPostDto);
  }

หวังว่าสิ่งนี้จะช่วยบางคนได้นะ เพราะฉันชอบ NestJS แต่ดูเหมือนว่าคู่มือและบทเรียนจะถูกตั้งขึ้นสำหรับ JSON APIs มากกว่าสำหรับแอป CRUD แบบเต็มรูปแบบแบบดั้งเดิม

บทความที่เกี่ยวข้อง