【Node.js × TypeScript × MongoDB】Mongooseを使ってウェブアプリケーションを開発する
Node.js、TypeScript、Mongoose を使ったアプリ開発:詳細解説
このチュートリアルを始める前に、以下の環境が整っていることを確認してください。
- Node.js がインストールされていること
- Visual Studio Code などの TypeScript 対応のエディタがインストールされていること
- MongoDB データベースが起動していること
プロジェクトのセットアップ
- 新しいディレクトリを作成し、プロジェクトのルートディレクトリに移動します。
- 以下のコマンドを実行して、プロジェクトに必要なライブラリをインストールします。
npm init -y
npm install mongoose typescript @types/mongoose
tsconfig.json
ファイルを作成し、以下の内容を追加します。
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"esModuleResolution": "node",
"allowJs": true,
"declaration": true,
"noImplicitAny": true
},
"include": ["src/**/*.ts"]
}
src
ディレクトリを作成し、すべての TypeScript ファイルをこのディレクトリに配置します。
Mongoose の設定
src/db.ts
ファイルを作成し、以下の内容を追加して、MongoDB データベースに接続します。
import mongoose from 'mongoose';
const dbUrl = 'mongodb://localhost:27017/yourDatabaseName';
mongoose.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on('error', (error: Error) => console.error('MongoDB connection error:', error));
db.once('open', () => console.log('Connected to MongoDB database'));
スキーマとモデルの定義
src/models/user.ts
ファイルを作成し、以下の内容を追加して、ユーザーを表すスキーマとモデルを定義します。
import mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
export const User = mongoose.model('User', userSchema);
ユーザーの作成
import { Request, Response } from 'express';
import { User } from '../models/user';
export const createUser = async (req: Request, res: Response) => {
const { name, email, password } = req.body;
const newUser = new User({ name, email, password });
try {
await newUser.save();
res.status(201).json({ message: 'User created successfully' });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
export const getAllUsers = async (req: Request, res: Response) => {
try {
const users = await User.find();
res.status(200).json(users);
} catch (error) {
res.status(500).json({ message: error.message });
}
};
アプリケーションの実行
import express from 'express';
import { createUser, getAllUsers } from './controllers/userController';
const app = express();
const port = 3000;
app.use(express.json());
app.post('/users', createUser);
app.get('/users', getAllUsers);
app.listen(port, () => console.log(`Server listening on port ${port}`));
Mongoose を TypeScript で使用するサンプルコード
このコードを実行するには、以下の手順が必要です。
npm init -y
npm install mongoose typescript @types/mongoose
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"esModuleResolution": "node",
"allowJs": true,
"declaration": true,
"noImplicitAny": true
},
"include": ["src/**/*.ts"]
}
コードの説明
db.ts
このファイルは、MongoDB データベースへの接続を設定します。
import mongoose from 'mongoose';
const dbUrl = 'mongodb://localhost:27017/yourDatabaseName';
mongoose.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on('error', (error: Error) => console.error('MongoDB connection error:', error));
db.once('open', () => console.log('Connected to MongoDB database'));
models/user.ts
このファイルは、ユーザーを表すスキーマとモデルを定義します。
import mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
export const User = mongoose.model('User', userSchema);
controllers/userController.ts
このファイルは、ユーザーの作成と取得を行うコントローラーを実装します。
import { Request, Response } from 'express';
import { User } from '../models/user';
export const createUser = async (req: Request, res: Response) => {
const { name, email, password } = req.body;
const newUser = new User({ name, email, password });
try {
await newUser.save();
res.status(201).json({ message: 'User created successfully' });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
export const getAllUsers = async (req: Request, res: Response) => {
try {
const users = await User.find();
res.status(200).json(users);
} catch (error) {
res.status(500).json({ message: error.message });
}
};
index.ts
このファイルは、Express アプリケーションを起動します。
import express from 'express';
import { createUser, getAllUsers } from './controllers/userController';
const app = express();
const port = 3000;
app.use(express.json());
app.post('/users', createUser);
app.get('/users', getAllUsers);
app.listen(port, () => console.log(`Server listening on port ${port}`));
- 以下のコマンドを実行して、TypeScript コンパイラを使用してコードをコンパイルします。
tsc
node dist/index.js
- ブラウザで
http://localhost:3000
にアクセスすると、サーバーが起動していることを確認できます。
使い方
- ユーザーを作成するには、以下の JSON データを
POST http://localhost:3000/users
エンドポイントに送信します。
Mongoose を TypeScript で使用するその他の方法
型エイリアスを使用して、Mongoose のモデル型をより簡潔に定義することができます。
type UserDocument = mongoose.Document & {
name: string;
email: string;
password: string;
};
const userSchema = new mongoose.Schema<UserDocument>({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
export const User = mongoose.model('User', userSchema);
ジェネリック型を使用して、さまざまなスキーマを持つモデルを定義することができます。
import mongoose from 'mongoose';
interface Document<T> extends mongoose.Document {
_id: mongoose.Schema.Types.ObjectId;
createdAt: Date;
updatedAt: Date;
[key: string]: T;
}
function createModel<T extends {}>(modelName: string, schema: mongoose.Schema<T>) {
return mongoose.model<Document<T>>(modelName, schema);
}
const userSchema = new mongoose.Schema<UserDocument>({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
export const User = createModel<UserDocument>('User', userSchema);
サードパーティ製のライブラリを使用する
Mongoose を TypeScript で使用する際に役立つサードパーティ製のライブラリがいくつかあります。
これらのライブラリは、型安全性を向上させ、コードをより簡潔にするのに役立ちます。
TypeScript の機能を活用する
TypeScript には、Mongoose を使用する際に役立つ多くの機能があります。
- ジェネリック型
- インターフェース
- 型エイリアス
- 型ガード
これらの機能を活用することで、コードをより型安全で読みやすくすることができます。
Mongoose を TypeScript で使用するには、さまざまな方法があります。自分に合った方法を見つけて、型安全で保守しやすいコードを書くようにしましょう。
node.js typescript mongoose