🚸

fastifyでswaggerを使う

2023/07/08に公開

🗒️いろいろハマったので、ドキュメント化する

こちらのスクラップを参考に、環境構築をした。
https://zenn.dev/nbstsh/scraps/79a8d99521ea89

🔨環境構築

fastifyの環境構築は、こちらを参考に行なってください。
https://zenn.dev/joo_hashi/articles/0ebf7d1b2a1721

🔨fastifyで、swaggerwo使用する

SwaggerをFastifyプロジェクトに統合することは可能です。Fastifyには fastify-swagger というプラグインがあり、これを使用することでSwagger UIとAPIドキュメンテーションを自動的に生成できます。

npmのパッケージを追加する

npm i @fastify/swagger
npm i @fastify/swagger-ui

以下のコードは、上記のFastifyサーバーと組み合わせてSwaggerを設定します:

import fastifySwagger from '@fastify/swagger';
import fastifySwaggerUi from '@fastify/swagger-ui';
import Fastify from 'fastify';

const fastify = Fastify();

fastify.register(fastifySwagger);
fastify.register(fastifySwaggerUi);

async function main() {
  await fastify.listen({
    port: 3000,
    host: '0.0.0.0',
  });
}

main().catch(console.error);

package.jsonのscriptを設定する

{
  "name": "first-project",
  "version": "1.0.0",
  "description": "はじめに この例では、FastifyとTypeScriptの使い方を説明します。空白の http Fastify サーバーが作成されます。",
  "main": "index.js",
  "scripts": {
    "build": "tsc -p tsconfig.json",
    "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@fastify/swagger": "^8.8.0",
    "@fastify/swagger-ui": "^1.9.2",
    "fastify": "^4.19.2"
  },
  "devDependencies": {
    "@types/node": "^20.4.0",
    "typescript": "^5.1.6"
  }
}

index.tsをコンパイルする

npm run build

ローカルサーバーを起動する

npm run start

エンドポイントにアクセスする。
http://0.0.0.0:3000/documentation/static/index.html

SwaggerUIが表示されれば成功🙌

📶POSTとGETができるようにする。

この設定だと、ブラウザでPOSTとGETができる。

import fastifySwagger from '@fastify/swagger';
import fastifySwaggerUi from '@fastify/swagger-ui';
import Fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';

const fastify = Fastify();

fastify.register(fastifySwagger);
fastify.register(fastifySwaggerUi);

let shopping = ['りんご', 'ぶどう', 'みかん']

const shoppingRoutes = async (server: FastifyInstance) => {
  server.get('/', {
    schema: {
      response: {
        200: {
          type: 'array',
          items: { type: 'string' }
        }
      }
    },
    handler: async (request: FastifyRequest, reply: FastifyReply) => {
      return shopping
    }
  });

  server.addSchema({
    $id: 'addItemSchema',
    type: 'object',
    required: ['item'],
    properties: {
      item: {
        type: 'string',
      },
    },
  });

  server.post('/', {
    schema: {
      body: { $ref: 'addItemSchema#' },
      response: {
        201: {
          type: 'array',
          items: { type: 'string' }
        },
      },
    },
    handler: async (
      request: FastifyRequest<{
        Body: {
          item: string;
        };
      }>,
      reply: FastifyReply,
    ) => {
      const body = request.body;
      shopping.push(body.item);
      return reply.code(201).send(shopping);
    },
  });
};

fastify.register(shoppingRoutes, { prefix: 'shopping' });

async function main() {
  await fastify.listen({
    port: 3000,
    host: '0.0.0.0',
  });
}

main().catch(console.error);

http://0.0.0.0:3000/documentation/static/index.html#/default/post_shopping_

Executeのボタンを押すと、POST GETが実行できる。POSTするときは、入力する場所があるので、JSON形式で入力する。


まとめ

あまり情報がないので、ChatGPTと相談しながら、試行錯誤してました💦
誰かのお役に立てると、嬉しいです。

こちらが公式
https://swagger.io/tools/swagger-ui/
パッケージについての解説
https://github.com/fastify/fastify-swagger-ui
日本語のマニュアルもあった?
https://manual.nodeai.io/docs/berry/4/

Jboy王国メディア

Discussion