Node.js、MongoDB、Express で列挙型(Enum)を作成して使用する
Node.js、MongoDB、Express で列挙型(Enum)を作成して使用する
このチュートリアルでは、Node.js、MongoDB、Express を使用して、Mongoose で列挙型(Enum)を作成および使用するする方法を説明します。 列挙型は、一連の定数を定義するために使用できる便利な機能です。 Mongoose で列挙型を使用すると、スキーマの定義をより明確かつ簡潔にし、データの整合性を保証するのに役立ちます。
前提知識
このチュートリアルを始める前に、以下の知識が必要です。
- Node.js の基本的な知識
- MongoDB の基本的な知識
- Express の基本的な知識
手順
-
プロジェクトのセットアップ
まず、新しい Node.js プロジェクトを作成する必要があります。 次のコマンドを使用して、プロジェクトディレクトリを作成し、必要な依存関係をインストールできます。
npm init -y npm install mongoose express mongodb
-
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
という名前の新しいモデルを作成します。 このモデルには、name
、email
、およびrole
という 3 つのフィールドがあります。role
フィールドは、admin
、user
、またはguest
のいずれかの値を持つことができます。 -
ユーザーの作成
次に、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
にアクセスすると、すべてのユーザーのリストが表示されます。 -
列挙型の使用
列挙型は、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
フィールドが必須であること、およびadmin
、user
、またはguest
のいずれかの値であることを指定します。node app.js
role
フィールドに無効な値を指定しようとすると、Mongoose からエラーがスローされます。
補足
- 列挙型は、ドメイン固有の値を表すために使用できます。 たとえば、
OrderStatus
列挙型を使用して、注文のステータス(pending
、shipped
、
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
という名前の新しいスキーマを作成します。name
、email
、およびrole
という 3 つのフィールドをスキーマに追加します。required: true
は、role
フィールドが必須であることを指定します。
User
モデルを作成します。
- app.js
- 新しい Express アプリケーションを作成します。
- サーバーをポート 3000 で起動します。
使い方
- 以下のコマンドを使用して、プロジェクトディレクトリを作成し、必要な依存関係をインストールします。
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
プロパティを使用して、有効な値のリストを指定します。 この場合、有効な値は 0
、1
、および 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
という名前の列挙型を定義します。 この列挙型には、Admin
、User
、および Guest
という 3 つのメンバーがあります。 role
フィールドは Role
型として定義されているため、このフィールドには列挙型のメンバーのみを格納できます。
Mongoose で列挙型を使用するには、さまざまな方法があります。 上記で紹介した方法はほんの一例です。 最適な方法は、具体的なニーズによって異なります。
node.js mongodb express