Node.jsでレスポンス情報を編集する方法

Node.jsでレスポンス情報を修正する方法を紹介します。コードもGit Hubに掲載するので参考にしてください。

概要

Node.jsでは、HTTPサーバーの作成やリクエストの処理を行います。
ここでは、以下バージョンを使用した、Node.jsでレスポンス情報を修正する方法を説明します。

Node.js v16.3.0

また、今回作成するコードは全て、GitHubに掲載しています。

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

Node.jsのhttpモジュールを使用して、HTTPサーバーを作成し、レスポンスを操作します。

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

response.js

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
  const path = url.parse(req.url, true).pathname;

  switch(path) {
    case "/json":
      const jsonResponse = {
        message: "This is a JSON response",
      };
      res.writeHead(200, {'Content-Type': 'application/json'});
      res.end(JSON.stringify(jsonResponse));
      break;

    case "/html":
      const htmlResponse = "<h1>This is an HTML response</h1>";
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.end(htmlResponse);
      break;

    case "/header":
      res.setHeader("Custom-Header", "Custom Value");
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end("Header set");
      break;

    case "/status":
      res.writeHead(201, {'Content-Type': 'text/plain'});
      res.end("Created");
      break;

    case "/error":
      const errorResponse = {
        error: "An error occurred",
      };
      res.writeHead(500, {'Content-Type': 'application/json'});
      res.end(JSON.stringify(errorResponse));
      break;

    default:
      res.writeHead(404, {'Content-Type': 'text/plain'});
      res.end("Not Found");
  }
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解説

  • Node.jsモジュールのインポート
const http = require('http');
const url = require('url');

上記コードでは、Node.jsのhttpurlという名前のモジュールを読み込んでいます。

  • JSONレスポンスのルート
case "/json":
  const jsonResponse = {
    message: "This is a JSON response",
  };
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(jsonResponse));
  break;

“/json"エンドポイントにGETリクエストが送られた場合、このコードはJSON形式のレスポンスを返します。

  • HTMLレスポンスのルート
case "/html":
  const htmlResponse = "<h1>This is an HTML response</h1>";
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(htmlResponse);
  break;

“/html"エンドポイントにGETリクエストが送られた場合、このコードはHTML形式のレスポンスを返します。

  • レスポンスヘッダー設定のルート
case "/header":
  res.setHeader("Custom-Header", "Custom Value");
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end("Header set");
  break;

“/header"エンドポイントにGETリクエストが送られた場合、このコードはレスポンスヘッダーにカスタムヘッダーを追加し、その結果をレスポンスとして返します。

  • ステータスコード設定のルート
case "/status":
  res.writeHead(201, {'Content-Type': 'text/plain'});
  res.end("Created");
  break;

“/status"エンドポイントにGETリクエストが送られた場合、このコードはレスポンスステータスコードを201(Created)に設定し、その結果をレスポンスとして返します。

  • エラーレスポンスのルート
case "/error":
  const errorResponse = {
    error: "An error occurred",
  };
  res.writeHead(500, {'Content-Type': 'application/json'});
  res.end(JSON.stringify(errorResponse));
  break;

“/error"エンドポイントにGETリクエストが送られた場合、このコードはレスポンスステータスコードを500(Internal ServerError)に設定し、エラーメッセージを含むJSON形式のレスポンスを返します。

  • サーバーの起動
server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

このコードは、3000番ポートでサーバーを起動します。サーバーが正常に起動すると、‘Server is running on port 3000’というメッセージがコンソールに表示されます。

テスト

## JSONレスポンスを返すエンドポイント
curl -X GET http://localhost:3000/json
## HTMLレスポンスを返すエンドポイント
curl -X GET http://localhost:3000/html
## カスタムヘッダーをレスポンスに追加するエンドポイント
curl -X GET http://localhost:3000/header
## 特定のステータスコードを返すエンドポイント
curl -X GET http://localhost:3000/status
## エラーレスポンスを返すエンドポイント
curl -X GET http://localhost:3000/error

このコードでは、ルートハンドラ内でさまざまな種類のレスポンスを生成しています。
JSONレスポンス、HTMLレスポンス、カスタムヘッダー、ステータスコード、リダイレクト、エラーレスポンスなどの機能を示しています

まとめ

レスポンスオブジェクト(resオブジェクト)を使用することで、以下のことが可能になります。

  • レスポンスヘッダーの設定や変更ができます。
  • レスポンスのHTTPステータスコードを設定できます。
  • レスポンスのボディデータを設定できます。JSONオブジェクト、文字列、バイナリデータなどの形式でデータを返すことができます。
  • レスポンスのエンコーディングや圧縮の設定を行うことができます。
  • リダイレクトやエラーハンドリングなど、特定の状況に応じたレスポンスの制御が可能です。

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