0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NestJSでユーティリティ処理を実装する

Last updated at Posted at 2024-05-31

NestJSの処理は基本的にモジュール単位(Modules,Controllers,Providers(サービス)のセット構成単位)で実装されるようですが、モジュールにするほどでもないユーティリティ的な共通処理をどうやって実装していいのか、調べてもよくわからなかったので我流で実装します。
※セオリーとかテンプレート的なものがあったらぜひ教えて頂きたいです。

ここでは例としてファイルのMD5ハッシュ値を算出するユーティリティ処理を実装します。

ユーティリティ処理用のフォルダを作る

{ワークスペースフォルダ}/src/の下にutilsというフォルダを作りました。
この中に雑多な共通処理を配置していこうと思います。

ユーティリティクラスの実装

例として、ファイルのMD5ハッシュを算出する共通処理を実装します。
ファイル名はmd5-util.model.tsとします。(ファイル名規則もよくわからないですが処理分類的にはモデルかなと思い…)

  • クラス: Md5Util
  • メソッド: getHash(filePath: string) : string
  • 説明: ファイルパスを引数に与えるとMD5のハッシュ値の文字列を返します
md5-util.model.ts
import * as crypto from 'crypto';
import * as fs from 'fs';

export class Md5Util {
    getHash(filePath: string) : string {
        const target = fs.readFileSync(filePath);
        const hash = crypto.createHash('md5');
        hash.update(target);
        return hash.digest("hex");
    }
}

ユーティリティ処理の呼び出し

FTP-GETしてきたファイルのMD5を求めてみます。

FTPの処理はこちらを参考に。

app.service.ts
import { Injectable } from '@nestjs/common';
import { FileInfo } from 'basic-ftp';
import { FtpService } from 'nestjs-ftp';
import { Md5Util } from './utils/md5-util.model'; //Md5Utilをインポート

@Injectable()
export class AppService {
  private _md5Util = new Md5Util; //Md5Utilのインスタンス
  constructor(
    private readonly _ftpService: FtpService,
  ){}

  async downloadFile(name: string): Promise<string> {
    const filePath = `/home/hoge/${name}`;
    try {
      await this._ftpService.downloadTo(filePath, name);
    } catch (error) {
      return "FTP-GET Failed.";
    }
    //MD5ハッシュ値取得
    const hash = this._md5Util.getHash(filePath);
    return `FTP-GET Completed. MD5=${hash}`;
  }
}

まとめ

結局普通にユーティリティ処理クラスを実装してそれをimportするだけで使えました。

でもまだよくわかっていないのがクラスのインスタンス化。
newを使っていいのかどうか。
AppServiceconstructor()_ftpService と同じように書いたら Md5Util の依存関係が解決できないというエラーが出たのでこうしたのですが。
あとわざわざオブジェクト生成しないでMd5Util.getHash()みたいに、C言語系のスタティック的な使い方ができたらいいのになと思ったり。
さらにいえばクラスにもせず関数(function)単位で呼び出せたらいいのに。

追記:関数のみのexport/import

クラスではなく関数のみのやり方がわかったので追記します。
下のように書き、直接関数名でimportして使う。

export const 関数名 = (引数: 型): 戻り値の型 => {
    処理
}

md5-util.model.ts
import * as crypto from 'crypto';
import * as fs from 'fs';

export const getMd5Hash = (filePath: string): string => {
    const target = fs.readFileSync(filePath);
    const hash = crypto.createHash('md5');
    hash.update(target);
    return hash.digest("hex");
}
app.service.ts
import { Injectable } from '@nestjs/common';
import { FileInfo } from 'basic-ftp';
import { FtpService } from 'nestjs-ftp';
import { getMd5Hash } from './utils/md5-util.model'; //getMd5Hashをインポート

@Injectable()
export class AppService {
  constructor(
    private readonly _ftpService: FtpService,
  ){}

  async downloadFile(name: string): Promise<string> {
    const filePath = `/home/hoge/${name}`;
    try {
      await this._ftpService.downloadTo(filePath, name);
    } catch (error) {
      return "FTP-GET Failed.";
    }
    //MD5ハッシュ値取得
    const hash = getMd5Hash(filePath);
    return `FTP-GET Completed. MD5=${hash}`;
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?