Nest.js で遊んでみた

Nest.js CLI の使い方

(1) Module の生成

> npx nest g module modules/articles

(2) Controller の生成

> npx nest g controller modules/articles

(3) Service の生成

> npx nest g service modules/articles

キャッシュ対応

(1) cache-manager パッケージをインストール

> npm install --save cache-manager

(2) app.module.ts 修正

// ① 変更
import { Module, CacheModule, CacheInterceptor } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ArticlesModule } from './modules/articles/articles.module';

@Module({
    // ② 変更
    imports: [
        ArticlesModule,
        CacheModule.register({
            ttl: 1,   // キャッシュの有効期間 (単位: 秒)
            max: 100, // キャッシュする最大個数
        }),
    ],

    controllers: [AppController],

    // ③ 変更
    providers: [
        AppService,
        {
            provide: APP_INTERCEPTOR,
            useClass: CacheInterceptor,
        },
    ],
})
export class AppModule { }

②はアプリ(モジュール)全体に影響する設定値。
API 個別に設定したい場合は Controller の API に対して別途設定できる。

(3) articles.controller.ts の修正

import { Controller, Get, CacheTTL } from '@nestjs/common'; // 変更
import { system } from '../../utils/system';

@Controller('articles')
export class ArticlesController {
    @Get()
    @CacheTTL(5) // API 個別にキャッシュの有効期間を指定する (単位: 秒)
    async findAll(): Promise<string> {
        // キャッシュ確認のため 500ms 待機する処理
        await system.timeout(500);

        return `This action returns all articles`;
    }
}

タスクスケジューリング (cron 的なもの)

タスクスケジューリングを使用すると、任意のコード(メソッド/関数)を、固定の日付/時刻、繰り返しの間隔、または指定した間隔で実行することができる。
Linux の世界では多くの場合 OS レベルで cron などのパッケージによって処理される。Node.js アプリの場合 cron のような機能をエミュレートするパッケージがいくつかあり。
Nest.js では人気のある node-cron パッケージを統合した@nestjs/schedule パッケージを提供している。

(1) @nestjs/schedule パッケージをインストール

npm install --save @nestjs/schedule

(2) ScheduleModule のインポート

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule'; // ①追加

import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
    imports: [
        ScheduleModule.forRoot(), // ②追加
    ],
    controllers: [AppController],
    providers: [
        AppService,
    ],
})
export class AppModule { }

(3) Service の生成と定期処理したいメソッドに @Cron を追加

> npx nest g service modules/articles


// src/modules/articles/articles.service.ts
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';

@Injectable()
export class ArticlesService {
    @Cron(CronExpression.EVERY_MINUTE) // 毎分実行することを指定
    createRankingData() {
        console.log(`実行日時: ${new Date()}`);
    }
}

(4) 実行結果

実行日時: Thu Feb 20 2020 10:46:00 GMT+0900 (GMT+09:00)
実行日時: Thu Feb 20 2020 10:47:00 GMT+0900 (GMT+09:00)
実行日時: Thu Feb 20 2020 10:48:00 GMT+0900 (GMT+09:00)
実行日時: Thu Feb 20 2020 10:49:00 GMT+0900 (GMT+09:00)

1分ごとに実行されていることが確認できた。

(5) 注意事項

google/cloud-run などの状況に応じてインスタンスが停止されたり、複数インスタンスが起動したりするクラウド実行環境では利用には注意が必要。

  • インスタンスが停止されれば指定した日時に処理が実行されない
  • 複数のインスタンスが立ち上がった場合、指定した日時に同じ処理が重複して実行される

クラウド実行環境の場合は @nestjs/schedule を使わずに google/cloud-scheduler などのサービスを利用する(まだ試してない)

広告欄
WRITTEN BY
SERIES
この記事に連載はありません。
READ NEXT
COMMENTS
コメント機能は開発中です。実装完了まで今しばらくお待ちください。