Express.jsでリクエストを取得と検証をする方法

Express.jsでリクエスト処理する方法を修正する方法を紹介します。コードもGit Hubに掲載するので参考にしてください。

概要

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

ここでは、以下バージョンを使用した、Express.jsでリクエスト処理する方法を説明します。

Express.js v4.17.1
nodejs v19.7.0

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

リクエスト情報を取得する方法

リクエストに関する情報を取得するには、リクエストオブジェクトを使用します。 リクエストオブジェクトは、クライアントからのリクエストに関する情報を格納しています。Express.jsのミドルウェア関数内で使用され、リクエストヘッダー、パラメータ、ボディなどのデータにアクセスするために利用されます。

以下のサンプルコードは、Express.jsでリクエストオブジェクトを理解するための例です。GETリクエストを受け取り、リクエストヘッダー、クエリパラメータにアクセスして、それらの値を含むレスポンスを返します。

request.js

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  // リクエストヘッダーの取得
  const headers = req.headers;

  // クエリパラメータの取得
  const queryParam = req.query.param;

  const response = {
    headers: headers,
    queryParam: queryParam,
  };

  res.json(response);
});

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

解説

  • Expressのインスタンスの作成
const express = require('express');
const app = express();

Expressモジュールをインポートし、そのインスタンスを作成します。

  • ルートハンドラの定義
app.get('/', (req, res) => {
  // リクエストヘッダーの取得
  const headers = req.headers;

  // クエリパラメータの取得
  const queryParam = req.query.param;

  const response = {
    headers: headers,
    queryParam: queryParam,
  };

  res.json(response);
});

ルート(’/’)へのGETリクエストをハンドリングします。リクエストが来ると、リクエストヘッダーとクエリパラメータを取得し、それらを含むオブジェクトをJSON形式でレスポンスとして返します。

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

Expressのインスタンスをポート3000でリッスンさせ、サーバーを起動します。サーバーが起動したら、“Server is running on port 3000"というメッセージをコンソールに出力します。

テスト

curl http://localhost:3000

リクエスト情報の検証する方法

Express.jsでは、ミドルウェア関数を使用してリクエストのバリデーションを行うことができます。

この例では、/usersエンドポイントにPOSTリクエストが送信された際に、nameとageのフィールドが必須であり、ageは数値であることを検証します。

バリデーションのためにjoiパッケージをインストールします。

npm install joi

validate.js

const express = require('express');
const Joi = require('joi');

const app = express();
app.use(express.json());

const schema = Joi.object({
  name: Joi.string().required(),
  age: Joi.number().required(),
});

app.post('/users', (req, res) => {
  const { error } = schema.validate(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const { name, age } = req.body;

  // バリデーションが成功した場合の処理
  res.send({ message: 'User created successfully', name, age });
});

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

解説

  • 必要なモジュールのインポート
const express = require('express');
const Joi = require('joi');

ExpressとJoi(バリデーションライブラリ)をインポートします。

  • Expressのインスタンスの作成とミドルウェアの設定
const app = express();
app.use(express.json());

Expressのインスタンスを作成し、JSONボディパーサーをミドルウェアとして設定します。これにより、リクエストボディをJSONとして解析できます。

  • バリデーションスキーマの定義
const schema = Joi.object({
  name: Joi.string().required(),
  age: Joi.number().required(),
});

Joiを使用してバリデーションスキーマを定義します。このスキーマでは、nameが必須の文字列、ageが必須の数値であることを要求しています。

  • ルートハンドラの定義
app.post('/users', (req, res) => {
  const { error } = schema.validate(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const { name, age } = req.body;

  // バリデーションが成功した場合の処理
  res.send({ message: 'User created successfully', name, age });
});

/usersへのPOSTリクエストをハンドリングします。リクエストボディをスキーマでバリデーションし、エラーがあれば400ステータスコードとエラーメッセージをレスポンスとして返します。バリデーションが成功した場合は、ユーザー作成成功のメッセージとユーザーの情報をレスポンスとして返します。

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

Expressのインスタンスをポート3000でリッスンさせ、サーバーを起動します。サーバーが起動したら、“Server is running on port 3000"というメッセージをコンソールに出力します。

# 正常なリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"John", "age": 25}' http://localhost:3000/users
# バリデーションエラーが発生するリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"John"}' http://localhost:3000/users

まとめ

reqオブジェクトを使用することで、以下のことが可能になります:

  • リクエストヘッダーやクエリパラメータなどのリクエストデータにアクセスできます。
  • リクエストのパスパラメータやボディデータなど、リクエストの異なる部分のデータを取得できます。
  • 認証トークンやセッション情報など、リクエストに関連する認証や認可の情報を取得できます。
  • ミドルウェア関数を使用して、リクエストデータのバリデーションや変換を行うことができます。

reqオブジェクトを使用することで、リクエストのデータによる様々な操作を行うことができます。 reqオブジェクトには、多くのプロパティやメソッドがあり、高度なカスタマイズや制御が可能です。