📝

NestJSでMongoDBに接続する際の.envの読み込み方

2022/10/03に公開

概要

NestJS で MongoDB を使う際、環境変数の読み込みで少し手こずったので、それについての備忘録を記述します。

記法の結論=> #環境変数を使って接続

環境

  • macOS Monterey 12.0.1
  • Node.js 18.9.0
  • NestJS 9.1.3
  • MongoDB Atlas

必要なものをインストール

ドキュメントの通り、NestJS で Mongo を使う際には、以下のコマンドで必要なものをインストール。
※Node.js や NestJS はインストールされている前提で進まさせて頂きます。

$ npm i @nestjs/mongoose mongoose

https://docs.nestjs.com/techniques/mongodb#connection

今回は、 TypeORM よりも多く使われているという Mongoose を利用。
(Mongoose: データのモデリングが簡単になる)

環境変数を使わずに接続する

DB の URI をベタ書きというケースはあまりないかもしれませんが、公式には最初に載っていたので記載します。

app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [MongooseModule.forRoot('mongodb+srv://<ユーザー名>:<パスワード>@cluster0.6tyabkp.mongodb.net/nest?retryWrites=true&w=majority')],
})
export class AppModule {}

MongoDB Atlas を使わない場合 (MongoDB Compass とか?のローカル) は、'mongodb://localhost:27017/<DB名>'みたいな URI になるかと思われます (実際に試してはないです)。

環境変数を使って接続

まず、環境変数ファイルを読み込むために必要なものをインストールします。

$ npm i --save @nestjs/config

https://docs.nestjs.com/techniques/configuration#configuration

読み込む予定の.env ファイルに環境変数を設定します。

.env
MONGO_URI = mongodb+srv://<ユーザー名>:<パスワード>@cluster0.6tyabkp.mongodb.net/nest?retryWrites=true&w=majority
# シングルクォーテーションは付けてもつけなくてもどちらでもよし

以下、環境変数読み込むバージョンのapp.module.tsになります。

app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
//@nestjs/configから新しくモジュールやサービスを追加
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (config: ConfigService) => ({
        uri: config.get<string>('MONGO_URI'),
      }),
    }),
    ],
})
export class AppModule {}

少し補足します。
useFactoryは、プロバイダーを動的に作る構文です。
injectプロパティには、useFactory に当てられた関数に引数として渡すことのできる、プロバイダーの配列が当てられています。
config.get()は、ConfigService に備えられている、環境変数を取得するためのメソッドです (これに関しては、ドキュメントが分かりやすいかと思います)。
https://docs.nestjs.com/techniques/configuration#using-the-configservice

さいごに

NestJS の学習頑張りたいです。
至らぬ点も多いかと思いますが、間違っている箇所などあれば、是非ご指摘いただけると幸いです。

GitHubで編集を提案

Discussion