0
0
Lập trình
Admin Team
Admin Teamtechmely

Tìm hiểu về Lifecycle Events trong NestJS: Ý nghĩa và ứng dụng thực tiễn

Đăng vào 1 tháng trước

• 4 phút đọc

Lifecycle Events trong NestJS là gì?

Lifecycle Events trong NestJS là các hook (móc vòng đời) mà framework cung cấp, cho phép bạn thực hiện logic vào những thời điểm cụ thể trong vòng đời của một module hoặc service. Các sự kiện này giúp bạn quản lý và điều khiển quá trình khởi tạo, xử lý, và hủy các thành phần trong ứng dụng.

Các Lifecycle Events chính trong NestJS

  1. onModuleInit

    • Được gọi khi module chứa service được khởi tạo.
    • Phương thức này thường dùng để khởi tạo dữ liệu hoặc thực hiện các tác vụ cần thiết trước khi module sẵn sàng phục vụ.
  2. onApplicationBootstrap

    • Được gọi sau khi toàn bộ ứng dụng đã hoàn tất khởi tạo (bootstrap).
    • Thích hợp cho việc thực hiện các tác vụ phụ thuộc vào toàn bộ ứng dụng.
  3. beforeApplicationShutdown

    • Được gọi trước khi ứng dụng tắt.
    • Dùng để giải phóng tài nguyên, đóng kết nối, hoặc thực hiện các công việc dọn dẹp cần thiết.
  4. onApplicationShutdown

    • Được gọi khi ứng dụng bị tắt hoặc khi nhận tín hiệu như SIGINT.
    • Thích hợp để thực hiện việc dọn dẹp sâu hơn, ví dụ, ngắt các kết nối cơ sở dữ liệu.
  5. onModuleDestroy

    • Được gọi khi một module bị hủy.
    • Mặc dù hiếm khi cần thiết, nhưng hữu ích nếu bạn có tài nguyên cục bộ ở module cần giải phóng.

Ví dụ thực tế về Lifecycle Events:

1. onModuleInit: Khởi tạo kết nối Redis

typescript Copy
import { Injectable, OnModuleInit } from '@nestjs/common';
import { RedisClient } from 'redis';

@Injectable()
export class CacheService implements OnModuleInit {
    private client: RedisClient;

    onModuleInit() {
        this.client = new RedisClient({ host: 'localhost', port: 6379 });
        console.log('Redis client initialized');
    }
}

2. onApplicationBootstrap: Tải cấu hình ứng dụng

typescript Copy
import { Injectable, OnApplicationBootstrap } from '@nestjs/common';

@Injectable()
export class AppService implements OnApplicationBootstrap {
    onApplicationBootstrap() {
        console.log('Application bootstrap complete.');
    }
}

3. beforeApplicationShutdown: Đóng kết nối đến cơ sở dữ liệu

typescript Copy
import { Injectable, OnApplicationShutdown } from '@nestjs/common';
import { Connection } from 'typeorm';

@Injectable()
export class DatabaseService implements OnApplicationShutdown {
    constructor(private readonly connection: Connection) {}

    async onApplicationShutdown() {
        console.log('Closing database connection...');
        await this.connection.close();
    }
}

4. onApplicationShutdown: Dọn dẹp hàng đợi

typescript Copy
import { Injectable, OnApplicationShutdown } from '@nestjs/common';
import { Queue } from 'bull';

@Injectable()
export class TaskService implements OnApplicationShutdown {
    constructor(private readonly taskQueue: Queue) {}

    async onApplicationShutdown() {
        console.log('Stopping task queue...');
        await this.taskQueue.close();
    }
}

Khi nào nên sử dụng Lifecycle Events?

  • onModuleInit: Khi bạn cần chuẩn bị tài nguyên cục bộ cho một module.
  • onApplicationBootstrap: Khi bạn cần thực hiện công việc phụ thuộc vào toàn bộ ứng dụng.
  • beforeApplicationShutdown: Khi cần dọn dẹp tài nguyên quan trọng trước khi ứng dụng dừng.
  • onApplicationShutdown: Dành cho các hành động dọn dẹp cuối cùng khi ứng dụng bị tắt.

Hệ quả nếu không sử dụng Lifecycle Events

1. Tài nguyên không được khởi tạo đúng cách

  • Hậu quả: Các tài nguyên quan trọng không được khởi tạo, dẫn đến lỗi runtime.

2. Công việc toàn cục không được hoàn tất

  • Hậu quả: Các tác vụ phụ thuộc vào toàn bộ ứng dụng có thể không chạy đúng cách.

3. Rò rỉ tài nguyên

  • Hậu quả: Tài nguyên như kết nối cơ sở dữ liệu không được giải phóng đúng cách, dẫn đến tiêu tốn tài nguyên.

4. Lỗi không dự đoán được khi ứng dụng tắt

  • Hậu quả: Tác vụ quan trọng không thực hiện khi ứng dụng tắt.

5. Ứng dụng không dễ bảo trì

  • Hậu quả: Logic khởi động và hủy tài nguyên khó quản lý.

6. Phụ thuộc vào cách làm thủ công

  • Hậu quả: Nếu không dùng lifecycle events, bạn phải tự thực hiện khởi tạo và hủy tài nguyên, gây ra lỗi dễ dàng.

Tại sao nên sử dụng Lifecycle Events trong ứng dụng NestJS?

Lifecycle Events giúp tự động hóa quy trình quản lý tài nguyên, đảm bảo ứng dụng hoạt động ổn định và dễ bảo trì.

  • Ổn định hơn: Tài nguyên được khởi tạo và giải phóng đúng thời điểm.
  • Dễ bảo trì: Logic quản lý tài nguyên được tách biệt rõ ràng.
  • Ít lỗi hơn: NestJS đảm bảo các event được gọi chính xác.

Kết luận:

Việc sử dụng Lifecycle Events trong NestJS cực kỳ quan trọng cho sự ổn định và hiệu suất của ứng dụng. Hãy áp dụng chúng để xây dựng ứng dụng dễ bảo trì và hiệu quả hơn.


Liên kết tham khảo

Ngoài ra, mình cũng đã viết thêm nhiều bài viết trong series NestJS cơ bản. Hãy ghé thăm để hiểu thêm về các khái niệm cốt lõi của NestJS.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào