【Node.js × TypeScript × MongoDB】Mongooseを使ってウェブアプリケーションを開発する

2024-05-21

Node.js、TypeScript、Mongoose を使ったアプリ開発:詳細解説

このチュートリアルを始める前に、以下の環境が整っていることを確認してください。

  • Node.js がインストールされていること
  • Visual Studio Code などの TypeScript 対応のエディタがインストールされていること
  • MongoDB データベースが起動していること

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

  1. 新しいディレクトリを作成し、プロジェクトのルートディレクトリに移動します。
  2. 以下のコマンドを実行して、プロジェクトに必要なライブラリをインストールします。
npm init -y
npm install mongoose typescript @types/mongoose
  1. 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"]
}
  1. src ディレクトリを作成し、すべての TypeScript ファイルをこのディレクトリに配置します。

Mongoose の設定

  1. 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'));

スキーマとモデルの定義

  1. 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}`));
  1. 以下のコマンドを実行して、TypeScript コンパイラを使用してコードをコンパイルします。
tsc
node dist/index.js
  1. ブラウザで 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


Node.jsプログラミング初心者でも安心!「ENOENT」エラーの解決法をわかりやすく解説

「ENOENT」は、Node. jsアプリケーションで発生する一般的なエラーの一つで、「No such file or directory」を意味します。これは、プログラムがアクセスしようとしたファイルまたはディレクトリが存在しないことを示します。このエラーは、さまざまな原因で発生する可能性があります。...


node.js 開発者の必須知識:npm の postinstall スクリプトを制御する方法

npm の postinstall スクリプトは、パッケージがインストールされた後に自動的に実行されるスクリプトです。これは、依存関係のインストール、ネイティブモジュールのコンパイル、またはその他のセットアップタスクを実行するために役立ちます。...


【事例付き】node.jsで社内利用限定コードをライセンス表記:All Rights Reserved、SEE LICENSE INの方法

Node. js パッケージの package. json ファイルには、ライセンス情報を含む様々な項目が設定できます。その中でも、ライセンス情報は、コードの利用許諾条件を明確にし、配布者と利用者双方の権利を守る上で重要な役割を果たします。...


その他の方法:Math.min()とMath.max()、テンプレートリテラル、ライブラリの使用

この例では、clampという関数を作成して、数値を指定された範囲内に制限しています。value は制限したい数値min は最小値この関数は、まずvalueがminよりも小さいかどうかをチェックします。小さい場合はminを返します。次に、valueがmaxよりも大きいかどうかをチェックします。大きい場合はmaxを返します。それ以外の場合は、valueをそのまま返します。...


Array.find、Array.findIndex、Array.filter、Array.some、reduce:ネストされたループの代替手段

ネストされた for each ループにおいて、break と continue を使用してループの制御を行うことは、複雑な処理を記述する際に役立ちます。しかし、それぞれの動作と、どのループに影響を与えるのかを理解することが重要です。break の動作...


SQL SQL SQL SQL Amazon で見る



TypeScriptでオブジェクトの型を定義する:インターフェース、型エイリアス、クラス、型パラメーター、discriminated unions徹底解説

インターフェースは、オブジェクトの構造を定義するための型です。インターフェースには、オブジェクトが持つべきプロパティの名前と型を記述します。インターフェースは、オブジェクトの型チェックやコード補完などの機能を提供します。上記の例では、Personというインターフェースを定義しています。Personインターフェースは、nameという文字列型プロパティと、ageという数値型プロパティを持つオブジェクトを表します。