Implementing a task scheduler in Nest.js can be done in two primary approaches: using the built-in @nestjs/schedule module or third-party libraries such as node-cron. Below is a detailed explanation and examples for both methods.
Using the @nestjs/schedule Module
Nest.js officially provides a task scheduling module @nestjs/schedule, which implements scheduled tasks using cron and setTimeout/setInterval. This module offers high integration with the Nest.js framework and is user-friendly.
Step 1: Install the Module
First, install the @nestjs/schedule module and cron using npm or yarn:
bashnpm install --save @nestjs/schedule npm install --save cron
Step 2: Import ScheduleModule
Import ScheduleModule into your application module (typically AppModule):
typescriptimport { Module } from '@nestjs/common'; import { ScheduleModule } from '@nestjs/schedule'; import { TasksService } from './tasks.service'; @Module({ imports: [ ScheduleModule.forRoot() ], providers: [TasksService], }) export class AppModule {}
Step 3: Create a Task Service
Next, create a service to define your scheduled tasks:
typescriptimport { Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; @Injectable() export class TasksService { @Cron(CronExpression.EVERY_HOUR) handleCron() { // This function executes every hour console.log('Run this task every hour'); } }
In the above code, we use the @Cron decorator to define a task that runs hourly. CronExpression is a predefined enumeration providing common cron configurations.
Using the node-cron Library
For greater flexibility, node-cron is a popular third-party library offering extensive cron task configuration options.
Step 1: Install node-cron
Install node-cron using npm or yarn:
bashnpm install --save node-cron
Step 2: Create Scheduled Tasks
Use node-cron to set up tasks within a service:
typescriptimport { Injectable } from '@nestjs/common'; import * as cron from 'node-cron'; @Injectable() export class CronJobsService { constructor() { this.scheduleTasks(); } private scheduleTasks() { cron.schedule('0 * * * *', () => { console.log('Run this task every hour'); }, { scheduled: true, timezone: "Asia/Shanghai" }); } }
In this example, we use cron.schedule to set up a task executing hourly. You can freely configure execution times using cron expressions.
Summary
The above are the two primary methods for implementing task scheduling in Nest.js. The choice depends on your project requirements and preferences regarding integration depth and third-party dependencies. @nestjs/schedule provides tighter integration with Nest.js, while node-cron offers greater flexibility and features.