NestJSの処理は基本的にモジュール単位(Modules,Controllers,Providers(サービス)のセット構成単位)で実装されるようですが、モジュールにするほどでもないユーティリティ的な共通処理をどうやって実装していいのか、調べてもよくわからなかったので我流で実装します。
※セオリーとかテンプレート的なものがあったらぜひ教えて頂きたいです。
ここでは例としてファイルのMD5ハッシュ値を算出するユーティリティ処理を実装します。
ユーティリティ処理用のフォルダを作る
{ワークスペースフォルダ}/src/
の下にutils
というフォルダを作りました。
この中に雑多な共通処理を配置していこうと思います。
ユーティリティクラスの実装
例として、ファイルのMD5ハッシュを算出する共通処理を実装します。
ファイル名はmd5-util.model.ts
とします。(ファイル名規則もよくわからないですが処理分類的にはモデルかなと思い…)
- クラス:
Md5Util
- メソッド:
getHash(filePath: string) : string
- 説明: ファイルパスを引数に与えるとMD5のハッシュ値の文字列を返します
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の処理はこちらを参考に。
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
を使っていいのかどうか。
AppService
の constructor()
に _ftpService
と同じように書いたら Md5Util
の依存関係が解決できないというエラーが出たのでこうしたのですが。
あとわざわざオブジェクト生成しないでMd5Util.getHash()みたいに、C言語系のスタティック的な使い方ができたらいいのになと思ったり。
さらにいえばクラスにもせず関数(function)単位で呼び出せたらいいのに。
追記:関数のみのexport/import
クラスではなく関数のみのやり方がわかったので追記します。
下のように書き、直接関数名でimportして使う。
export const 関数名 = (引数: 型): 戻り値の型 => {
処理
}
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");
}
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}`;
}
}