Skip to content

ExpressからKtorへの移行

このガイドでは、基本的なシナリオにおけるExpressアプリケーションからKtorへの移行方法について説明します。アプリケーションの生成から最初のアプリケーションの記述、そしてアプリケーション機能を拡張するためのミドルウェアの作成までを扱います。

アプリケーションを生成する

Express

express-generatorツールを使用して、新しいExpressアプリケーションを生成できます。

shell
Ktor

Ktorは、アプリケーションのスケルトンを生成する以下の方法を提供します。

詳細な手順については、

新しいKtorプロジェクトを作成、開く、実行する
Ktorでサーバーアプリケーションを開き、実行し、テストする方法を学びます。
チュートリアルを参照してください。

Hello world

このセクションでは、GETリクエストを受け入れ、事前定義されたプレーンテキストで応答する最もシンプルなサーバーアプリケーションを作成する方法を見ていきます。

Express

以下の例は、サーバーを起動し、ポート 3000 で接続をリッスンするExpressアプリケーションを示しています。

javascript

完全な例については、 1_hello プロジェクトを参照してください。

Ktor

Ktorでは、embeddedServer 関数を使用してコード内でサーバーパラメータを設定し、アプリケーションを素早く実行できます。

kotlin

完全な例については、 1_hello プロジェクトを参照してください。

また、HOCONまたはYAML形式を使用する外部設定ファイルでサーバー設定を指定することもできます。

上記のExpressアプリケーションは、 DateX-Powered-By 、および ETag 応答ヘッダーを追加することに注意してください。これらは次のようになります。

Ktorの各レスポンスにデフォルトの Server および Date ヘッダーを追加するには、

DefaultHeaders
必要な依存関係: io.ktor:%artifact_name% ネイティブサーバーサポート: ✅
プラグインをインストールする必要があります。
ConditionalHeaders
必要な依存関係: io.ktor:%artifact_name% コード例: %example_name% ネイティブサーバーサポート: ✅
プラグインは、 Etag 応答ヘッダーを設定するために使用できます。

静的コンテンツの提供

このセクションでは、ExpressとKtorで画像、CSSファイル、JavaScriptファイルなどの静的ファイルをどのように提供するかを見ていきます。 public フォルダにメインの index.html ページと、それにリンクされた一連のアセットがあるとします。

Express

Expressでは、フォルダ名を express.static 関数に渡します。

javascript

完全な例については、 2_static プロジェクトを参照してください。

Ktor

Ktorでは、staticFiles() 関数を使用して、 / パスへのリクエストを public 物理フォルダにマッピングします。 この関数は、 public フォルダ内のすべてのファイルを再帰的に提供することを可能にします。

kotlin

完全な例については、2_static プロジェクトを参照してください。

静的コンテンツを提供する場合、Expressは次のような応答ヘッダーをいくつか追加します。

Ktorでこれらのヘッダーを管理するには、以下のプラグインをインストールする必要があります。

  • Accept-Ranges :

    PartialContent
    必要な依存関係: io.ktor:%artifact_name% サーバー例: download-file, クライアント例: client-download-file-range ネイティブサーバーサポート: ✅

  • Cache-Control :

    CachingHeaders
    必要な依存関係: io.ktor:%artifact_name% コード例: %example_name% ネイティブサーバーサポート: ✅

  • ETag および Last-Modified :

    ConditionalHeaders
    必要な依存関係: io.ktor:%artifact_name% コード例: %example_name% ネイティブサーバーサポート: ✅

ルーティング

ルーティング
ルーティングは、サーバーアプリケーションで受信リクエストを処理するためのコアプラグインです。
は、特定のHTTPリクエストメソッド(GETPOSTなど)とパスによって定義される、特定のエンドポイントへの受信リクエストを処理できます。 以下の例は、/パスへのGETおよび POSTリクエストを処理する方法を示しています。

Express
javascript

完全な例については、 3_router プロジェクトを参照してください。

Ktor
kotlin

TIP

POSTPUT、または PATCHリクエストの本文を受信する方法については、リクエストの受信を参照してください。

完全な例については、 3_router プロジェクトを参照してください。

以下の例は、パスごとにルートハンドラーをグループ化する方法を示しています。

Express

Expressでは、app.route()を使用して、ルートパスの連鎖可能なルートハンドラーを作成できます。

javascript

完全な例については、 3_router プロジェクトを参照してください。

Ktor

Ktorはroute関数を提供しており、これによりパスを定義し、そのパスの動詞をネストされた関数として配置できます。

kotlin

完全な例については、 3_router プロジェクトを参照してください。

どちらのフレームワークも、関連するルートを単一のファイルにグループ化することを可能にします。

Express

Expressは、マウント可能なルートハンドラーを作成するためにexpress.Routerクラスを提供します。 アプリケーションのディレクトリに birds.js ルーターファイルがあるとします。 このルーターモジュールは、app.js に示されているようにアプリケーションにロードできます。

javascript
javascript

完全な例については、 3_router プロジェクトを参照してください。

Ktor

Ktorでは、一般的なパターンとして、Routing型に拡張関数を使用して実際のルートを定義します。 以下のサンプル( Birds.kt )は、birdsRoutes拡張関数を定義しています。 この関数をroutingブロック内で呼び出すことで、対応するルートをアプリケーション( Application.kt )に含めることができます。

kotlin
kotlin

完全な例については、 3_router プロジェクトを参照してください。

URLパスを文字列として指定する以外に、Ktorには

型安全なルート
Resourcesプラグインを使用すると、型安全なルーティングを実装できます。
を実装する機能が含まれています。

ルートパラメータとクエリパラメータ

このセクションでは、ルートパラメータとクエリパラメータにアクセスする方法を示します。

ルート(またはパス)パラメータは、URL内のその位置で指定された値をキャプチャするために使用される、名前付きのURLセグメントです。

Express

Expressでルートパラメータにアクセスするには、Request.paramsを使用できます。 例えば、以下のコードスニペットのreq.parameters["login"]は、 admin/user/admin パスの場合に返します。

javascript

完全な例については、 4_parameters プロジェクトを参照してください。

Ktor

Ktorでは、ルートパラメータは{param}構文を使用して定義されます。 ルートハンドラーでルートパラメータにアクセスするには、call.parametersを使用できます。

kotlin

完全な例については、 4_parameters プロジェクトを参照してください。

以下の表は、クエリ文字列のパラメータにアクセスする方法を比較しています。

Express

Expressでルートパラメータにアクセスするには、Request.paramsを使用できます。 例えば、以下のコードスニペットのreq.parameters["login"]は、 admin/user/admin パスの場合に返します。

javascript

完全な例については、 4_parameters プロジェクトを参照してください。

Ktor

Ktorでは、ルートパラメータは{param}構文を使用して定義されます。 ルートハンドラーでルートパラメータにアクセスするには、call.parametersを使用できます。

kotlin

完全な例については、 4_parameters プロジェクトを参照してください。

レスポンスの送信

これまでのセクションでは、プレーンテキストコンテンツで応答する方法を見てきました。 JSON、ファイル、およびリダイレクト応答を送信する方法を見ていきましょう。

JSON

Express

Expressで適切なコンテンツタイプを含むJSONレスポンスを送信するには、 res.json関数を呼び出します。

javascript

完全な例については、 5_send_response プロジェクトを参照してください。

Ktor

Ktorでは、

ContentNegotiation
ContentNegotiationプラグインには、クライアントとサーバー間でメディアタイプをネゴシエートすること、およびコンテンツを特定の形式でシリアライズ/デシリアライズすることという2つの主要な目的があります。
プラグインをインストールし、 JSONシリアライザを設定する必要があります。

kotlin

データをJSONにシリアライズするには、@Serializableアノテーションを付けたデータクラスを作成する必要があります。

kotlin

次に、call.respondを使用してこのクラスのオブジェクトをレスポンスで送信できます。

kotlin

完全な例については、 5_send_response プロジェクトを参照してください。

ファイル

Express

Expressでファイルで応答するには、res.sendFileを使用します。

javascript

完全な例については、 5_send_response プロジェクトを参照してください。

Ktor

Ktorは、クライアントにファイルを送信するためのcall.respondFile関数を提供します。

kotlin

完全な例については、 5_send_response プロジェクトを参照してください。

Expressアプリケーションは、ファイルで応答する際に Accept-Ranges HTTP応答ヘッダーを追加します。 サーバーは、ファイルダウンロードのためのクライアントからの部分的なリクエストのサポートを宣伝するためにこのヘッダーを使用します。 Ktorでは、部分的なリクエストをサポートするために

PartialContent
必要な依存関係: io.ktor:%artifact_name% サーバー例: download-file, クライアント例: client-download-file-range ネイティブサーバーサポート: ✅
プラグインをインストールする必要があります。

ファイル添付

Express

res.download関数は、指定されたファイルを添付ファイルとして転送します。

javascript

完全な例については、 5_send_response プロジェクトを参照してください。

Ktor

Ktorでは、ファイルを添付ファイルとして転送するために、 Content-Disposition ヘッダーを手動で設定する必要があります。

kotlin

完全な例については、 5_send_response プロジェクトを参照してください。

リダイレクト

Express

Expressでリダイレクト応答を生成するには、redirect関数を呼び出します。

javascript

完全な例については、 5_send_response プロジェクトを参照してください。

Ktor

Ktorでは、respondRedirectを使用してリダイレクト応答を送信します。

kotlin

完全な例については、 5_send_response プロジェクトを参照してください。

テンプレート

ExpressとKtorの両方で、ビューを扱うためのテンプレートエンジンを使用できます。

Express

以下に示すPugテンプレートが views フォルダにあるとします。

このテンプレートで応答するには、res.renderを呼び出します。

javascript

完全な例については、 6_templates プロジェクトを参照してください。

Ktor

Ktorは、FreeMarker、Velocityなど、いくつかの

JVMテンプレートエンジン
HTML/CSSまたはJVMテンプレートエンジンで構築されたビューを扱う方法を学びます。
をサポートしています。 例えば、アプリケーションリソースに配置されたFreeMarkerテンプレートで応答する必要がある場合、 FreeMarkerプラグインをインストールして設定し、 call.respondを使用してテンプレートを送信します。

kotlin

完全な例については、 6_templates プロジェクトを参照してください。

リクエストの受信

このセクションでは、さまざまな形式でリクエストボディを受信する方法を示します。

生テキスト

以下のPOSTリクエストは、テキストデータをサーバーに送信します。

http

このリクエストの本文をサーバー側でプレーンテキストとして受信する方法を見てみましょう。

Express

Expressで受信リクエストボディをパースするには、body-parserを追加する必要があります。

javascript

postハンドラーでは、テキストパーサー(bodyParser.text)を渡す必要があります。 リクエストボディはreq.bodyプロパティから利用できます。

javascript

完全な例については、 7_receive_request プロジェクトを参照してください。

Ktor

Ktorでは、call.receiveTextを使用してボディをテキストとして受信できます。

kotlin

完全な例については、 7_receive_request プロジェクトを参照してください。

JSON

このセクションでは、JSONボディを受信する方法を見ていきます。 以下のサンプルは、JSONオブジェクトをボディに含むPOSTリクエストを示しています。

http
Express

ExpressでJSONを受信するには、bodyParser.jsonを使用します。

javascript

完全な例については、 7_receive_request プロジェクトを参照してください。

Ktor

Ktorでは、

ContentNegotiation
ContentNegotiationプラグインには、クライアントとサーバー間でメディアタイプをネゴシエートすること、およびコンテンツを特定の形式でシリアライズ/デシリアライズすることという2つの主要な目的があります。
プラグインをインストールし、 Jsonシリアライザーを設定する必要があります。

kotlin

受信したデータをオブジェクトにデシリアライズするには、データクラスを作成する必要があります。

kotlin

次に、このデータクラスをパラメータとして受け入れるreceiveメソッドを使用します。

kotlin

完全な例については、 7_receive_request プロジェクトを参照してください。

URLエンコード

次に、 application/x-www-form-urlencoded タイプを使用して送信されたフォームデータを受信する方法を見ていきましょう。 以下のコードスニペットは、フォームデータを含むサンプルPOSTリクエストを示しています。

http
Express

プレーンテキストやJSONと同様に、Expressではbody-parserが必要です。 パーサーのタイプをbodyParser.urlencodedに設定する必要があります。

javascript

完全な例については、 7_receive_request プロジェクトを参照してください。

Ktor

Ktorでは、call.receiveParameters関数を使用します。

kotlin

完全な例については、 7_receive_request プロジェクトを参照してください。

生データ

次のユースケースはバイナリデータの処理です。 以下のリクエストは、 application/octet-stream タイプでPNG画像をサーバーに送信します。

http
Express

Expressでバイナリデータを扱うには、パーサーのタイプをrawに設定します。

javascript

完全な例については、 7_receive_request プロジェクトを参照してください。

Ktor

Ktorは、バイトシーケンスの非同期読み書きのためにByteReadChannelByteWriteChannelを提供します。

kotlin

完全な例については、 7_receive request プロジェクトを参照してください。

マルチパート

最後のセクションでは、マルチパートボディの処理方法を見ていきましょう。 以下のPOSTリクエストは、 multipart/form-data タイプを使用して、説明付きのPNG画像を送信します。

http
Express

Expressは、マルチパートデータをパースするために別のモジュールを必要とします。 以下の例では、 multer がファイルをサーバーにアップロードするために使用されています。

javascript

完全な例については、 7_receive_request プロジェクトを参照してください。

Ktor

Ktorでは、マルチパートリクエストの一部として送信されたファイルを受信する必要がある場合、 receiveMultipart関数を呼び出し、必要に応じて各パートをループ処理します。 以下の例では、PartData.FileItemがバイトストリームとしてファイルを受信するために使用されています。

kotlin

完全な例については、 7_receive_request プロジェクトを参照してください。

ミドルウェアの作成

最後に見ていくのは、サーバー機能を拡張できるミドルウェアの作成方法です。 以下の例は、ExpressとKtorを使用してリクエストロギングを実装する方法を示しています。

Express

Expressでは、ミドルウェアはapp.useを使用してアプリケーションにバインドされた関数です。

javascript

完全な例については、 8_middleware プロジェクトを参照してください。

Ktor

Ktorは、

カスタムプラグイン
独自のカスタムプラグインを作成する方法を学びます。
を使用してその機能を拡張できます。 以下のコード例は、リクエストロギングを実装するためにonCallを処理する方法を示しています。

kotlin

完全な例については、 8_middleware プロジェクトを参照してください。

次のステップ

このガイドでは、セッション管理、認可、データベース統合など、まだ多くのユースケースがカバーされていません。 これらの機能のほとんどについて、Ktorはアプリケーションにインストールして必要に応じて設定できる専用のプラグインを提供しています。 Ktorでの学習を続けるには、ステップバイステップのガイドとすぐに使えるサンプルが提供されている Learnページ にアクセスしてください。