Skip to content

はじめる

最初の型安全なAPIを構築する準備はできましたか?さっそく始めましょう!

クイックセットアップ(準備中!)

bash
npm create kori-app my-api  # 🚧 準備中!
cd my-api
npm run dev

APIがhttp://localhost:3000で動作しています

基本的なAPI

最初のエンドポイントを作成:

typescript
import { createKori } from '@korix/kori';

const app = createKori();

app.get('/hello', (ctx) => {
  return ctx.res.text('Hello, Kori!');
});

export { app };

リクエスト&レスポンス

さまざまなタイプのリクエストとレスポンスの処理:

typescript
import { createKori } from '@korix/kori';

const app = createKori();

app.get('/users/:id', (ctx) => {
  // パスパラメータ
  const { id } = ctx.req.pathParams();
  return ctx.res.json({
    id,
    name: `User ${id}`,
    active: true,
  });
});

app.get('/info', (ctx) => {
  // リクエスト/レスポンスヘッダー
  const userAgent = ctx.req.header('user-agent');
  return ctx.res.setHeader('x-custom', 'value').status(200).json({ userAgent });
});

export { app };

ログ

組み込まれた構造化ログでアプリケーションを監視:

typescript
import { createKori } from '@korix/kori';

const app = createKori().onStart((ctx) => {
  // インスタンスレベルのログ(フック内)
  ctx.log().info('Application initializing');
});

app.get('/hello', (ctx) => {
  // リクエストレベルのログ(ハンドラー内)
  ctx.log().info('Processing hello request');

  return ctx.res.text('Hello, Kori!');
});

// アプリケーションレベルのログ(Koriコンテキスト外)
app.log().info('Application ready');

export { app };
  • app.log() - アプリケーションレベルのロガー(Koriコンテキスト外)
  • ctx.log() - コンテキスト対応ロガー(Koriコンテキスト内:フックとハンドラー)

サンプルログ出力:

json
{"time":1754198335875,"level":"info","channel":"app","name":"instance","message":"Application ready","meta":{}}
{"time":1754198335875,"level":"info","channel":"app","name":"instance","message":"Application initializing","meta":{}}
{"time":1754198335879,"level":"info","channel":"sys","name":"instance","message":"Kori server started at http://127.0.0.1:3000","meta":{}}
{"time":1754198349150,"level":"info","channel":"app","name":"request","message":"Processing hello request","meta":{}}

Koriは素早い開発のためにデフォルトでシンプルなコンソールロガーを提供します。実際のアプリケーションには、PinoやLogTapeなどの高性能ロガーを使用してください。簡単な統合のためのアダプターを提供しています。

フック

初期化とリクエストライフサイクル処理を追加:

typescript
import { createKori } from '@korix/kori';

const app = createKori()
  .onStart((ctx) => {
    // アプリケーション開始時に一度実行
    return ctx.withEnv({ applicationStartTime: new Date() });
  })
  .onRequest((ctx) => {
    // 各リクエストハンドラーの前に実行
    ctx.log().info(`${ctx.req.method()} ${ctx.req.url().pathname}`);

    // ハンドラー完了後までレスポンスログを遅延
    ctx.defer(() => {
      ctx.log().info(`Response: ${ctx.res.getStatus()}`);
    });
  });

app.get('/hello', (ctx) => {
  // 環境拡張への型安全なアクセス
  const uptime = Date.now() - ctx.env.applicationStartTime.getTime();
  return ctx.res.text(`Hello, Kori! Uptime: ${uptime}ms`);
});

export { app };

プラグイン

再利用可能なプラグインで機能を拡張:

typescript
import { createKori } from '@korix/kori';
import { securityHeadersPlugin } from '@korix/security-headers-plugin';

const app = createKori()
  // すべてのレスポンスにセキュリティヘッダーを追加
  .applyPlugin(securityHeadersPlugin());

app.get('/api/data', (ctx) => {
  return ctx.res.json({ message: 'Secure API!' });
});

export { app };

バリデーション

ファーストクラスZodサポートによる型安全なバリデーション:

typescript
import { createKori } from '@korix/kori';
import { zodRequestSchema } from '@korix/zod-schema';
import { createKoriZodRequestValidator } from '@korix/zod-validator';
import { z } from 'zod';

const CreateUserSchema = z.object({
  name: z.string().min(1),
  age: z.number().int().min(0).optional(),
});

const app = createKori({
  requestValidator: createKoriZodRequestValidator(),
});

app.post('/users', {
  requestSchema: zodRequestSchema({ body: CreateUserSchema }),
  handler: (ctx) => {
    // 型安全なバリデーション済みボディアクセス
    const { name, age } = ctx.req.validatedBody();

    // ビジネスロジック(データベースへの保存など)

    return ctx.res.status(201).json({
      id: Math.random().toString(36),
      name,
      age,
      createdAt: new Date().toISOString(),
    });
  },
});

export { app };

OpenAPI

バリデーションスキーマからインタラクティブなAPIドキュメントを生成:

typescript
import { createKori } from '@korix/kori';
import { createKoriZodRequestValidator } from '@korix/zod-validator';
import { zodRequestSchema } from '@korix/zod-schema';
import { zodOpenApiPlugin } from '@korix/zod-openapi-plugin';
import { scalarUiPlugin } from '@korix/openapi-scalar-ui-plugin';
import { z } from 'zod';

const CreateUserSchema = z.object({
  name: z.string().min(1),
  age: z.number().int().min(0).optional(),
});

const app = createKori({
  requestValidator: createKoriZodRequestValidator(),
})
  // ZodスキーマからOpenAPI仕様を生成
  .applyPlugin(
    zodOpenApiPlugin({
      info: { title: 'My API', version: '1.0.0' },
    }),
  )
  // インタラクティブなドキュメントUIを提供
  .applyPlugin(scalarUiPlugin());

app.post('/users', {
  requestSchema: zodRequestSchema({ body: CreateUserSchema }),
  handler: (ctx) => {
    // 型安全なバリデーション済みボディアクセス
    const { name, age } = ctx.req.validatedBody();

    // ビジネスロジック(データベースへの保存など)

    return ctx.res.status(201).json({
      id: Math.random().toString(36),
      name,
      age,
      createdAt: new Date().toISOString(),
    });
  },
});

export { app };

http://localhost:3000/docsでインタラクティブなドキュメントをご覧ください!

Released under the MIT License.