ARTICLES

LoopBack の REST コントローラでデフォルトの limit 値を設定しておく

2019-09-16

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 検定プロジェクトメンバー

    著作一覧はこちら