Node.js、MongoDB、Express で列挙型(Enum)を作成して使用する

2024-06-21

Node.js、MongoDB、Express で列挙型(Enum)を作成して使用する

このチュートリアルでは、Node.jsMongoDBExpress を使用して、Mongoose で列挙型(Enum)を作成および使用するする方法を説明します。 列挙型は、一連の定数を定義するために使用できる便利な機能です。 Mongoose で列挙型を使用すると、スキーマの定義をより明確かつ簡潔にし、データの整合性を保証するのに役立ちます。

前提知識

このチュートリアルを始める前に、以下の知識が必要です。

  • Node.js の基本的な知識
  • MongoDB の基本的な知識
  • Express の基本的な知識

手順

  1. プロジェクトのセットアップ

    まず、新しい Node.js プロジェクトを作成する必要があります。 次のコマンドを使用して、プロジェクトディレクトリを作成し、必要な依存関係をインストールできます。

    npm init -y
    npm install mongoose express mongodb
    
  2. Mongoose モデルの作成

    次に、Mongoose モデルを作成する必要があります。 モデルは、MongoDB コレクションのスキーマを定義します。 次のコマンドを使用して、user.js という名前の新しいファイルを 作成し、以下のコードを追加します。

    const mongoose = require('mongoose');
    
    const userSchema = new mongoose.Schema({
      name: String,
      email: String,
      role: {
        type: String,
        enum: ['admin', 'user', 'guest']
      }
    });
    
    const User = mongoose.model('User', userSchema);
    
    module.exports = User;
    

    このコードは、User という名前の新しいモデルを作成します。 このモデルには、nameemail、および role という 3 つのフィールドがあります。 role フィールドは、adminuser、または guest のいずれかの値を持つことができます。

  3. ユーザーの作成

    次に、Mongoose モデルを使用して新しいユーザーを作成してみましょう。 次のコマンドを使用して、app.js という名前の新しいファイルを 作成し、以下のコードを追加します。

    const express = require('express');
    const User = require('./user');
    
    const app = express();
    
    app.get('/users', async (req, res) => {
      const users = await User.find();
      res.json(users);
    });
    
    app.listen(3000, () => {
      console.log('Server listening on port 3000');
    });
    

    このコードは、/users エンドポイントへの GET リクエストを処理する Express アプリケーションを作成します。 このエンドポイントは、すべてのユーザーのリストを返します。

    次に、以下のコマンドを使用してサーバーを起動します。

    node app.js
    

    ブラウザで http://localhost:3000/users にアクセスすると、すべてのユーザーのリストが表示されます。

  4. 列挙型の使用

    列挙型は、Mongoose のスキーマのバリデーションに使用できます。 次のコマンドを使用して、user.js ファイルを編集し、role フィールドのバリデーションを追加します。

    const mongoose = require('mongoose');
    
    const userSchema = new mongoose.Schema({
      name: String,
      email: String,
      role: {
        type: String,
        enum: ['admin', 'user', 'guest'],
        required: true
      }
    });
    
    const User = mongoose.model('User', userSchema);
    
    module.exports = User;
    

    このコードは、role フィールドが必須であること、および adminuser、または guest のいずれかの値であることを指定します。

    node app.js
    

    role フィールドに無効な値を指定しようとすると、Mongoose からエラーがスローされます。

補足

  • 列挙型は、ドメイン固有の値を表すために使用できます。 たとえば、OrderStatus 列挙型を使用して、注文のステータス(pendingshipped



user.js

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  role: {
    type: String,
    enum: ['admin', 'user', 'guest'],
    required: true
  }
});

const User = mongoose.model('User', userSchema);

module.exports = User;

app.js

const express = require('express');
const User = require('./user');

const app = express();

app.get('/users', async (req, res) => {
  const users = await User.find();
  res.json(users);
});

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

説明

  • user.js
    • mongoose モジュールをインポートします。
    • userSchema という名前の新しいスキーマを作成します。
    • nameemail、および role という 3 つのフィールドをスキーマに追加します。
      • required: true は、role フィールドが必須であることを指定します。
    • User モデルを作成します。
  • app.js
    • 新しい Express アプリケーションを作成します。
    • サーバーをポート 3000 で起動します。

使い方

  1. 以下のコマンドを使用して、プロジェクトディレクトリを作成し、必要な依存関係をインストールします。
npm init -y
npm install mongoose express mongodb
node app.js
  • このコードは、列挙型を使用して Mongoose スキーマを定義する方法を示す基本的な例です。
  • 実際のアプリケーションでは、より複雑なスキーマと列挙型を使用する可能性があります。



Mongoose で列挙型を使用するその他の方法

カスタムバリデーションを使用して、role フィールドの値が有効な列挙型の値であることを確認できます。 次の例は、カスタムバリデーション関数を実装する方法を示しています。

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  role: {
    type: String,
    validate: {
      validator: (value) => {
        return ['admin', 'user', 'guest'].includes(value);
      },
      message: 'Invalid role value'
    },
    required: true
  }
});

const User = mongoose.model('User', userSchema);

module.exports = User;

このコードは、validate プロパティを使用してカスタムバリデーションを追加します。 このバリデーション関数は、role フィールドの値が ['admin', 'user', 'guest'] 配列に含まれているかどうかを確認します。 値が無効な場合は、Invalid role value というエラーメッセージがスローされます。

Number 型を使用する

role フィールドを Number 型として定義し、列挙型の値を数値にマップすることもできます。 次の例は、この方法を実装する方法を示しています。

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  role: {
    type: Number,
    enum: [0, 1, 2],
    required: true
  }
});

const User = mongoose.model('User', userSchema);

module.exports = User;

このコードは、role フィールドを Number 型として定義します。 enum プロパティを使用して、有効な値のリストを指定します。 この場合、有効な値は 01、および 2 です。

TypeScript を使用している場合は、列挙型をより厳密に定義できます。 次の例は、TypeScript で列挙型を定義する方法を示しています。

enum Role {
  Admin = 0,
  User = 1,
  Guest = 2
}

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  role: {
    type: Role,
    required: true
  }
});

const User = mongoose.model('User', userSchema);

export default User;

このコードは、Role という名前の列挙型を定義します。 この列挙型には、AdminUser、および Guest という 3 つのメンバーがあります。 role フィールドは Role 型として定義されているため、このフィールドには列挙型のメンバーのみを格納できます。

Mongoose で列挙型を使用するには、さまざまな方法があります。 上記で紹介した方法はほんの一例です。 最適な方法は、具体的なニーズによって異なります。


node.js mongodb express


Web Worker、Electron、NW.js、Parcel:Node.jsとブラウザ間でコードを共有するその他の方法

ユーティリティ関数データ処理ロジックビジネスロジックコード共有にはいくつかの方法があり、それぞれメリットとデメリットがあります。メリット:コードを一つの場所にまとめることができるバージョン管理が容易依存関係を管理しやすいモジュールの公開・管理が必要...


Node.jsでできること:リアルタイムWebアプリケーションからIoTまで

Node. jsが広く使われている理由は以下の通りです。高速でスケーラブル: Node. jsは、非同期入出力とイベント駆動アーキテクチャを採用しているため、高速でスケーラブルなアプリケーションを構築することができます。これは、大量の同時接続を処理する必要があるWebアプリケーションなどに適しています。...


Node.js モジュール開発:module.exports を使って関数・変数・オブジェクトを公開する方法

module. exports は、以下の2つの役割を担っています。モジュールの公開インターフェースを定義する モジュールから他のモジュールへ公開したい関数・変数・オブジェクトなどを module. exports に格納することで、外部からアクセス可能になります。...


Passport.jsで「Error: failed to serialize user into session」エラーが発生!原因は?

Passport. jsは、Node. jsアプリケーションにおける認証を容易にする人気のライブラリです。しかし、serializeUserメソッドの実装ミスなどが原因で、「Error: failed to serialize user into session」エラーが発生することがあります。このエラーは、Passport...


Node.jsのバージョン管理: nvmによるアップグレードガイド

nvmをインストールしていない場合は、公式ドキュメントに従ってインストールしてください。https://www. freecodecamp. org/news/node-version-manager-nvm-install-guide/現在のNode...