NestJS導入 Middleware編
おはようございます!スペースマーケットの小見と申します。
NestJS導入ブログ第3回、今回はMiddlewareの設定について書いていきます。
基本的には公式を参考に実現した利用例を記載していきます。
完成版は以下の用になります。
Middlewareとは
Middlewareはルートハンドラーの前に呼び出される関数です。(公式翻訳)
つまりコントローラーやサービス層の諸々の処理の前に呼び出す事が可能な処理と認識しております。
何が出来るのか
* リクエストのパラメーター出力
* リクエストヘッダー情報のチェック
など主にHttpリクエストに対して共通して行いたいことを設定できます。
ヘルスチェックの実装
今回は例としてヘルチェックのOKレスポンスを返す部分をMiddlewareで実装しようと思います。
RequestとResponseとNextFunctionを引数に設定したメソッドを作成します。
この時メソッド名は何でも問題ありません。
// src/healthCheck.middleware.ts
import { Request, Response, NextFunction } from 'express';
export function healthCheck(req: Request, res: Response, next: NextFunction) {
if (req.url === '/status.html') {
return res.send('ok');
}
return next();
}
main.tsに上記で作成したメソッドを読み込ませて実装完了になります。
(すごい簡単ですね。)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { healthCheck } from './healthCheck.middleware';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(healthCheck);
await app.listen(3000);
}
bootstrap();
これで、/status.htmlにアクセスした時にokが返却されるようになります。
個人的に詰まった部分としてFastifyの場合は、以下のように引数の型が異なりますので、詳細な実装部分も若干異なってきます。
import { IncomingMessage, ServerResponse } from 'http';
export function healthCheck(
req: IncomingMessage,
res: ServerResponse,
next: any,
) {
if (req.url === '/status.html') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
}
return next();
}
まとめ
Fastify実装が公式ドキュメントで見つけることが出来ず、
この解決方法にたどり着けませんでしたので、どなたかの手助けになれば幸いです。
最後に宣伝です。
スペースマーケットでは、エンジニアを募集中です。
スペースシェアが当たり前になる世界観を目指して日々開発を進めています。プロダクトにご興味があれば是非、下記リンクよりご応募お待ちしております。
お仕事や作業に集中できるスペースをワークルームと言うカテゴリで検索出来るようになりました。
出先で少し作業したい場合などに便利なので機会あれば見てみて下さい。