LoopBack という Node.js 上で構築されている Web アプリケーションフレームワークがあります。
少し前までは Nest.js という Web アプリケーションフレームワークをいじっていたのですが、最近のマイブームは、LoopBack です。
LoopBack は、現在バージョン 4 です。バージョン 4 から TypeScript で構築された新しいフレームワークとして生まれ変わりました。新しく生まれ変わったため、リポジトリも異なり、1万を超えていたスター数も最新版のリポジトリでは 2000 程度にとどまっています。
LoopBack はコントローラを作成する際に CRUD 系のメソッドがついたコントローラを選ぶことが出来ます。
What kind of controller would you like to generate?
REST Controller with CRUD functions
ただ、この生成されたコントローラはちょっとした問題があって limit
を設定しないと、全件セレクトとなってしまいます。
コントローラのドキュメントは @param.query.number('limit') limit
を指定することによってクエリーストリングから limit
の指定を取得して反映させる点が記載されています。
ただ find
メソッドに { limit }
を指定してしまうと、せっかくの CRUD メソッドが活きなくなってしまいます。
デフォルトで引数に指定されている @param.query.object('filter', getFilterSchemaFor(MODEL)) filter
にも limit
プロパティを指定することが出来ます。そのため、こちらを活かすことで特に何も指定しないで GET
をリクエストした際の全件取得を防ぐことが出来ます。
filter
パラメータですが、このような union
型として定義されています filter: Filter<VaqumUris> | undefined
なので、オブジェクトの存在を確認しつつ、もし limit
の指定があればそれを優先し、なければデフォルト値を指定するようにすればよいことになります。
でも全部のコントローラで同じようなことをするのは面倒ですよね。ということで、下記のようなコントローラ用のヘルパ関数を書いてみました。様々なモデルで利用することを前提に Filter
型の型引数を指定するようにしています。
import {
Filter,
Entity,
} from '@loopback/repository';
/**
* Filter のマージ
* @param filter
* @param limit
*/
export function mergeFilter<T extends Entity>(filter: Filter<T> | undefined, limit: number): Filter<T> {
if (filter != null) {
filter.limit = filter.limit ? filter.limit : limit
return filter;
} else {
return { limit }
}
}
以下のように使います
@get('/goods', {
responses: {
'200': {
description: '...',
content: {
'application/json': {
schema: { type: 'array', items: getModelSchemaRef(MODEL) },
},
},
},
},
})
async find(
@param.query.object('filter', getFilterSchemaFor(MODEL)) _filter?: Filter<MODEL>
): Promise<MODEL[]> {
const filter = mergeFilter(_filter, querySettings.DEFAULT_DISPLAY_COUNT)
return this.modelRepository.find(filter);
}
はじめて LoopBack のコントローラを見た方は「なんじゃこりゃ」って思うかもしれませんが、Nest.js とかやっていると「ああ、このタイプね」ってなるかもしれません。イマドキな Node.js の Web アプリケーションは、こういうスタイルをしていることが多いです。普通に async
を使うところもイマドキですね。
ARTICLES
AUTHOR

原 一浩
カンソクインダストリーズ代表 / グレーティブ合同会社代表
1998年に独立し、同年、ウェブデザイン専門のメールメディア DesignWedgeの発行を開始。Webデザイン業の傍ら、海外のWebデザインに関する情報発信を行う。
雑誌への寄稿多数。主な著書に『はじめてのフロントエンド開発』『プロセスオブウェブデザイン』、『Play framework徹底入門』、『ウェブデザインコーディネートカタログ』など。自社製のWebデザインのクロール&キャプチャシステムvaqumをベースに、様々なリサーチを行っている。Web 検定プロジェクトメンバー。