くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

nitroでファイルシステムじゃないルーティングを実現する

tsoaNitro/H3に対応したいと思い、
いろいろ調べてみたときの備忘録(*´ω`*)

Nitroではファイルシステムベースでルーティングしてくれるが、
tsoaなどルーティングを自動生成したい場合、ちょっと困る。

H3自体にはRouterが存在するので、
NitroのPluginsを使って実現できそう。

ソースはこんな感じ

// plugins/1.routing.ts
import { createRouter, eventHandler, lazyEventHandler } from "h3";

export default defineNitroPlugin((nitroApp) => {
  // routerに登録するroute/handlerのリスト
  const handlers = [
    {
      route: "/foo",
      handler: eventHandler(async (event) => ({ nitro: "this is /foo" })),
      method: "get",
    },
    {
      route: "/",
      handler: eventHandler(async (event) => ({ nitro: "this is /" })),
      method: "get",
    },
  ];

  // 各routeをlazyEventHandlerでラップしながら登録
  for (const h of handlers) {
    nitroApp.router.use(h.route, h.handler, h.method as any);
  };
});

pnpm nitropack buildを実行すると、
.output/server/chunks/nitro/node-server.mjsが作成される。

ビルドされた結果にも同様の感じで、routesディレクトリのファイルを読み取った結果が
routerとして登録されているので、それを参考にしてみた感じ。

(nitropack2.5系とnitropack2.6系で違うっぽいので要注意)


以上!! これで自動生成できそうな気がする(*´ω`*)