Basic Setup
NestJs 結合了 Mongoose 提供了一個更好的方式來操作 MongoDB, 以及搭配官方提供的 @nestjs/config
來管理環境變數, Configuration 相關設定可以參考這裡
安装所需套件
pnpm add i @nestjs/mongoose mongoose
將 Mongo 連線用的機密資訊設定在 config/env 中
env
記得不要放到 cloud:
.env
APP_DOMAIN=YOUR_DOMAIN
MONGO_DB_NAME=YOUR_DB_NAME
MONGO_SESSION_DB_COLLECTION=YOUR_COLLECTION_NAME
MONGO_SESSION_DOMAIN=.${APP_DOMAIN}
MONGO_SESSION_NAME=
MONGO_SESSION_SECRET=
MONGO_URI=mongodb://127.0.0.1:27017
在 configuration.factory.ts
及 configuration.import.ts
中加上 Mongo 相關的設定:
configuration.factory.ts
import { registerAs } from '@nestjs/config';
export const databaseConfigFactory = registerAs('database', () => {
const uri = `${process.env.MONGO_URI}/${process.env.MONGO_DB_NAME}`;
return { ssl: process.env.SSL, uri };
});
// ...
configuration.factory.ts
主要放我們所有的設定邏輯, 例如上面分類了兩種設定檔, 一個是 database 相關, 一個是 general 使用- registerAs 是一個 helper function, 用來將設定檔註冊到 config service 中, 並且可以分類設定檔 (database, general), 以及可以先處理相關邏輯後再將最後的值回傳出去
configuration.import.ts
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
import { databaseConfigFactory, generalConfigFactory } from './configuration.factory';
export function loadConfigImports() {
return [
ConfigModule.forRoot({
envFilePath: ['.env', '.env.staging', '.env.prod'],
isGlobal: true,
load: [generalConfigFactory, databaseConfigFactory], // 加上 databaseConfigFactory
expandVariables: true // Enable environment variable expansion
}),
// 引入 MongooseModule
MongooseModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
ssl: configService.get<boolean>('database.ssl'),
uri: configService.get<string>('database.uri')
})
})
];
}
MongooseModule.forRootAsync
是用來設定 Mongoose 的連線設定, 我們 inject 了ConfigService
來取得環境變數, 並且透過useFactory
來設定 Mongoose 的連線設定
上面設定完後, 因為在之前的 Configuration 中已經 import 到 AppModule
, 所以我們已經完成了與 MongoDB 的連線設定, 我們可以啟動 server 來測試看看是否成功: