目次
Zodを使用してKnex.jsクエリのレスポンスを型安全に検証する
Knex.jsを使用してデータベースから情報を取得する際、レスポンスの形状や内容が期待通りであることを確認したい場面があります。
この記事では、Zodを使用してKnex.jsのレスポンスを型安全に検証する方法を解説します。
必要なパッケージのインストール
初めに、必要なパッケージをインストールします。
Knex.jsとZodをそれぞれインストールします。
npm install knex zod
Knex.jsクエリの作成
users テーブルと orders テーブルを左結合して、それぞれのテーブルから特定のカラムを選択します。
const knex = require('knex')({
  client: 'pg',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});
knex('users')
  .leftJoin('orders', 'users.id', 'orders.user_id')
  .select('users.id as user_id', 'users.name', 'orders.id as order_id', 'orders.hoge')
  .then(data => {
    console.log(data);
  })
  .catch(err => {
    console.error(err);
  });
Zodスキーマの定義
次に、上記のクエリのレスポンスに対応するZodのスキーマを定義します。
import { z } from 'zod';
const userOrderSchema = z.object({
  user_id: z.number(),
  name: z.string(),
  order_id: z.number(),
  hoge: z.string()
});
データの検証
取得したデータが期待する形状かどうかをZodを使って検証します。
const sampleData = [
  { user_id: 1, name: 'Alice', order_id: 101, hoge: 'value1' },
  { user_id: 2, name: 'Bob', order_id: 102, hoge: 'value2' }
];
// データの検証
const parsedData = userOrderSchema.array().parse(sampleData);
console.log(parsedData);  // 検証が成功した場合、元のデータがそのまま返されます
この方法を使用することで、Knex.jsから取得したデータが正しい形状であることを確認することができます。
また、Zodは例外をスローすることで、不正なデータ構造をランタイムで即座に識別することが可能です。