DenoのOakでレスポンス情報を修正する方法

概要

DenoのOakフレームワークでは、リクエストの処理はミドルウェア関数内で行います。
ミドルウェア関数の引数には、contextオブジェクトが渡されます。 このcontextオブジェクトを使用して、リクエストに関連するデータの取得やレスポンスの生成などを行います。

ここでは、以下バージョンを使用した、DenoのOakでレスポンス情報を修正する方法を説明します。

Deno v1.12.0
Oak v8.0.0

また、今回作成するコードは全て、以下に掲載しています。 https://github.com/wiblok/Deno-Oak

レスポンス情報を編集する方法

contextオブジェクトのresponseプロパティは、クライアントへのレスポンスを構築するために使用されます。 Oakのルートハンドラ内で利用され、レスポンスのヘッダー、ステータスコード、データなどを設定するために利用されます。

以下のサンプルコードは、DenoのOakでcontextオブジェクトのresponseプロパティを理解するための例です。GETリクエストを受け取り、異なる種類のレスポンスを生成して返します。

response.ts

import { Application, Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();

router.get("/json", (context) => {
  const jsonResponse = {
    message: "This is a JSON response",
  };
  context.response.body = jsonResponse;
});

router.get("/html", (context) => {
  const htmlResponse = "<h1>This is an HTML response</h1>";
  context.response.headers.set("Content-Type", "text/html");
  context.response.body = htmlResponse;
});

router.get("/header", (context) => {
  context.response.headers.set("Custom-Header", "Custom Value");
  context.response.body = { message: "Check the headers!" };
});

router.get("/error", (context) => {
  const errorResponse = {
    error: "An error occurred",
  };
  context.response.status = 500;
  context.response.body = errorResponse;
});

const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 3000 });

解説

このソースコードは、DenoのOakサーバを作成し、異なるエンドポイントを提供しています。

  • Oakモジュールのインポートとルーターの作成:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const router = new Router();

この部分では、Oakモジュールを読み込み、新しいルーターを作成しています。

  • GETリクエストハンドラー /json:
router.get("/json", (context) => {
  const jsonResponse = {
    message: "This is a JSON response",
  };
  context.response.body = jsonResponse;
});

このハンドラーは、/jsonへのGETリクエストに対してJSON形式のレスポンスを返します。

  • GETリクエストハンドラー /html
router.get("/html", (context) => {
  const htmlResponse = "<h1>This is an HTML response</h1>";
  context.response.headers.set("Content-Type", "text/html");
  context.response.body = htmlResponse;
});

このハンドラーは、/htmlへのGETリクエストに対してHTML形式のレスポンスを返します。レスポンスのContent-Typeヘッダーをtext/htmlに設定しています。

  • GETリクエストハンドラー /header
router.get("/header", (context) => {
  context.response.headers.set("Custom-Header", "Custom Value");
  context.response.body = { message: "Check the headers!" };
});

このハンドラーは、/headerへのGETリクエストに対してレスポンスヘッダーにカスタム値を設定し、メッセージをJSON形式で返します。

  • GETリクエストハンドラー /error
router.get("/error", (context) => {
  const errorResponse = {
    error: "An error occurred",
  };
  context.response.status = 500;
  context.response.body = errorResponse;
});

このハンドラーは、/errorへのGETリクエストに対してエラーメッセージとHTTPステータスコード500をレスポンスとして返します。

  • アプリケーションの作成とルーターの登録
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

この部分で、新しいOakアプリケーションインスタンスを作成し、ルーターをアプリケーションに登録しています。

  • サーバーの起動
await app.listen({ port: 3000 });

この部分で、アプリケーションにルーターを適用し、サーバーがポート3000でリスンするように設定しています。サーバーが起動したら、“サーバーがポート3000で起動しました"というメッセージがコンソールに表示されます。

このコードでは、ルートハンドラ内でさまざまな種類のレスポンスを生成しています。
JSONレスポンス、HTMLレスポンス、カスタムヘッダー、ステータスコード、エラーレスポンスなどの機能を示しています。Oakの便利なメソッドを使用して、簡潔かつ柔軟なレスポンスの生成が可能です。

テスト

以下は各エンドポイントをテストするためのcurlコマンドの例です。

## json 
curl http://localhost:3000/json
## html
curl http://localhost:3000/html
## header
curl -I http://localhost:3000/header
## error
curl http://localhost:3000/error

まとめ

contextオブジェクトのresponseプロパティを使用することで、以下のことが可能になります。

  • レスポンスヘッダーの設定や変更ができます。
  • レスポンスのHTTPステータスコードを設定できます。
  • レスポンスのボディデータを設定できます。JSONオブジェクト、文字列、バイナリデータなどの

形式でデータを返すことができます。

  • レスポンスのエンコーディングや圧縮の設定を行うことができます。

Oakを使用することで、Denoアプリケーション内でレスポンスの生成に関するさまざまな操作を行うことができます。Oakのcontextオブジェクトには多くのプロパティやメソッドがあり、高度なカスタマイズや制御が可能です。