本文へ移動

Pylon ​

Pylon を使った GraphQL API の構築は簡単です。Pylon は Hono 上に構築されたバックエンドフレームワークで、コードファーストの GraphQL API 開発を提供します。

GraphQL スキーマは TypeScript の定義からリアルタイムで生成されるため、サービスのロジックの記述に集中できます。この方法は開発を大幅に速め、型安全性を高め、エラーを減らします。

コードに破壊的な変更を加えると、すぐに API に反映され、機能への影響を即座に確認できます。

詳しくは Pylon をご覧ください。

新しい Pylon サービスのセットアップ ​

Pylon では、npm create pylon コマンドで新しいサービスを作成できます。このコマンドは、基本的な構造と設定を持つ Pylon プロジェクトを作成します。 セットアップ中に、Bun、Node.js、Cloudflare Workers など、使用するランタイムを選べます。

このガイドでは Bun ランタイムを使います。

新しいプロジェクトの作成 ​

次のコマンドで新しい Pylon プロジェクトを作成します。

bash
npm create pylon my-pylon@latest

my-pylon という新しいディレクトリが作成され、基本的な Pylon プロジェクトの構造が用意されます。

プロジェクトの構造 ​

Pylon プロジェクトの構造は次のとおりです。

my-pylon/
├── .pylon/
├── src/
│   ├── index.ts
├── package.json
├── tsconfig.json
  • .pylon/:プロジェクトの本番ビルドを格納します。
  • src/:プロジェクトのソースコードを格納します。
  • src/index.ts:Pylon サービスのエントリーポイントです。
  • package.json:npm パッケージの設定ファイルです。
  • tsconfig.json:TypeScript の設定ファイルです。

基本的な例 ​

基本的な Pylon サービスの例を示します。

ts
import { app } from '@getcronit/pylon'

export const graphql = {
  Query: {
    sum: (a: number, b: number) => a + b,
  },
  Mutation: {
    divide: (a: number, b: number) => a / b,
  },
}

export default app

API の保護 ​

Pylon は、クラウドネイティブな ID・アクセス管理ソリューションの ZITADEL と連携し、API に安全な認証と認可を提供します。ZITADEL のドキュメントに従うと、Pylon API を簡単に保護できます。

より複雑な API の作成 ​

Pylon のリアルタイムのスキーマ生成を使うと、より複雑な API を作成できます。対応する TypeScript の型や API の定義方法については、Pylon のドキュメントを参照してください。

この例では、Pylon で複雑な型とサービスを定義する方法を示します。TypeScript のクラスとメソッドを使うことで、データベース、外部サービス、その他のリソースとやり取りする強力な API を作成できます。

ts
import { app } from '@getcronit/pylon'

class Post {
  id: string
  title: string

  constructor(id: string, title: string) {
    this.id = id
    this.title = title
  }
}

class User {
  id: string
  name: string

  constructor(id: string, name: string) {
    this.id = id
    this.name = name
  }

  static async getById(id: string): Promise<User> {
    // Fetch user data from the database
    return new User(id, 'John Doe')
  }

  async posts(): Promise<Post[]> {
    // Fetch posts for this user from the database
    return [new Post('1', 'Hello, world!')]
  }

  async $createPost(title: string, content: string): Promise<Post> {
    // Create a new post for this user in the database
    return new Post('2', title)
  }
}

export const graphql = {
  Query: {
    user: User.getById,
  },
  Mutation: {
    createPost: (userId: string, title: string, content: string) => {
      const user = User.getById(userId)
      return user.$createPost(title, content)
    },
  },
}

export default app

API の呼び出し ​

Pylon API は、任意の GraphQL クライアントライブラリから呼び出せます。開発には、API とリアルタイムでやり取りできる Web ベースの GraphQL IDE、Pylon Playground を推奨します。

  1. プロジェクトのディレクトリで bun run dev を実行し、Pylon サーバーを起動します。
  2. ブラウザーで http://localhost:3000/graphql にアクセスし、Pylon Playground を開きます。
  3. 左側のパネルに GraphQL のクエリまたはミューテーションを記述します。

Hono のコンテキストへのアクセス ​

getContext 関数で、コード内のどこからでも Hono のコンテキストにアクセスできます。この関数は現在のコンテキストオブジェクトを返し、リクエスト、レスポンス、その他のコンテキスト固有のデータを取得できます。

ts
import { app, getContext } from '@getcronit/pylon'

export const graphql = {
  Query: {
    hello: () => {
      const context = getContext()
      return `Hello, ${context.req.headers.get('user-agent')}`
    },
  },
}

export default app

Hono のコンテキストオブジェクトとそのプロパティの詳細については、Hono のドキュメントと Pylon のドキュメントを参照してください。

Hono の役割は? ​

Pylon は、Web アプリケーションと API を構築するための軽量な Web フレームワーク、Hono の上に構築されています。Hono は HTTP リクエストとレスポンスを処理する中核機能を提供し、Pylon はそれを拡張して GraphQL API の開発をサポートします。

GraphQL に加えて、Pylon では基盤となる Hono アプリケーションのインスタンスにアクセスし、独自のルートやミドルウェアを追加できます。これにより、Hono の機能を十分に活用して、より複雑な API やサービスを構築できます。

ts
import { app } from '@getcronit/pylon'

export const graphql = {
  Query: {
    sum: (a: number, b: number) => a + b,
  },
  Mutation: {
    divide: (a: number, b: number) => a / b,
  },
}

// Add a custom route to the Pylon app
app.get('/hello', (ctx, next) => {
  return new Response('Hello, world!')
})

まとめ ​

Pylon は、GraphQL API の開発を簡単にする強力な Web フレームワークです。TypeScript の型定義からリアルタイムでスキーマを生成し、型安全性を高め、エラーを減らします。Pylon を使えば、ビジネス要件を満たす、安全でスケーラブルな API を素早く構築できます。Hono との統合により、GraphQL API の開発に集中しながら Hono のすべての機能を利用できます。

Pylon の詳細は、公式ドキュメントをご覧ください。

関連情報 ​

MIT ライセンスで公開されています。