NestJSでMongoDBに接続する際の.envの読み込み方
概要
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
今回は、 TypeORM よりも多く使われているという Mongoose を利用。
(Mongoose: データのモデリングが簡単になる)
環境変数を使わずに接続する
DB の URI をベタ書きというケースはあまりないかもしれませんが、公式には最初に載っていたので記載します。
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
読み込む予定の.env ファイルに環境変数を設定します。
MONGO_URI = mongodb+srv://<ユーザー名>:<パスワード>@cluster0.6tyabkp.mongodb.net/nest?retryWrites=true&w=majority
# シングルクォーテーションは付けてもつけなくてもどちらでもよし
以下、環境変数読み込むバージョンの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 に備えられている、環境変数を取得するためのメソッドです (これに関しては、ドキュメントが分かりやすいかと思います)。
さいごに
NestJS の学習頑張りたいです。
至らぬ点も多いかと思いますが、間違っている箇所などあれば、是非ご指摘いただけると幸いです。
Discussion