Web開発ログ | エンジニアに役立つ情報 | 開発の中での気づきを発信

高卒Devlog

TSLab【第7回 Express勉強会】mongoose(ORM)

thumbnail

こんにちは! RYOTAです!

当記事をご覧くださりありがとうございます!

定例になりましたTypeScript勉強会を開催したので実施ログを残していきます!

内容

前回の勉強会ではMognoDBをDocker環境で構築しましたので、今回の勉強会ではExpressからMongoDBにアクセスしてデータを取得していきます。
今回はORMにmongooseを使用します。
MongoDBを操作するためのnpmライブラリで、一般的にMongoDB × Node.jsの場合はこちらを使用するっぽい(?)です。

  • mongoose

GitHub - Automattic/mongoose: MongoDB object modeling designed to work in an asynchronous environment. MongoDB object modeling designed to work in an asynchronous environment. - GitHub - Automattic/mongoose: MongoDB object modeling designed to work in an asynchronous environment. GitHub
それでは早速やっていきましょう!

mongooseを設定

mongooseインストール

まずは本命のmongooseをインストールしていきます。
こいつがいないと何も始まりません。(笑)

$ yarn add mongoose

mongooseコネクション設定

インストールが完了したらmongooseの接続設定を行なっていきます。
記述する箇所はExpressのルートにあるindex.ts(またはmain.ts)になります。
アプリケーションを定義しているファイルに下記の記述をします。

import mongoose from 'mongoose'

dotenv.config({ path: __dirname + '/.env' })
mongoose.connect('mongodb://mongo:27017/mongoose_api', {
  user: process.env.MONGOOSE_USERNAME,
  pass: process.env.MONGOOSE_PASSWORD,
})
const db = mongoose.connection
db.on('error', console.error.bind(console, 'DB connection error:'))
db.once('open', () => console.log('DB connection successful'))

mongoose.Promise = global.Promise

環境変数のロードにはdotenvを使用します。

MONGODB_USERNAME={ユーザー名を指定}
MONGODB_PASSWORD={パスワードを指定}

スキーマ設定

DBコネクション設定ができたらusersデータアクセス用のスキーマを設定します。
今回はデモデータとしてユーザー情報をDBに入れており、name: string と age: number の二つのプロパティを持たせています。

import mongoose, { Schema, Document } from 'mongoose'
export interface UserDoc extends Document {
  name: String
  age: Number
}

const userSchema: Schema = new Schema(
  {
    name: {
      type: String,
      trim: true,
      required: true,
    },
    age: {
      type: Number,
    },
  },
  {
    timestamps: true,
  }
)

export default mongoose.model<UserDoc>('User', userSchema)

APIで呼び出し

ここまでで設定については完了したので実際にデータを呼び出す処理を記述します。
今回はユーザー一覧を取得するだけの簡単なAPIを実装します。
(と言っても追加はこれだけです。)

// 定義したスキーマをインポート
import User from '../../models/User'

// ユーザー一覧を取得
const data = await User.find({})

これで無事にデータが取れればOKです!
簡単ですね!

さいごに

今回はExpress環境でサクッとMongoDBにアクセスしていきました。
思ったよりも記述に関しては少なくて簡単に接続ができたので驚きました。
ただし、MognoDB側のアクセス権限でハマったのでそちらは別の記事にまとめていこうと思います。
MongoDBの構築について気になる方は下記の記事を併せてご覧くださいませ!
https://kosotudev.com/mongodb-docker/
ExpressのAPI設計について気になる方は下記の記事をご覧くださいませ!
https://kosotudev.com/typescript-session-20211215/