Skip to main content

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.tsconfiguration.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 來測試看看是否成功:

basic-setup-with-config-1.png