《👋 NestJs手摸手系列 👋 》,教你通过Docker搭建mongo容器,采用 @nestjs/mongoose 链接mongodb,并采用ENV配置
示例代码
🌰 02-nestjs-mongoose-docker github
🐟 预备知识
- 🪵 NodeJs 基础
- 💿 Mongodb
- 🔧 Mongoose
- 🍺 Docker
一、🆕 新建项目
(1) 安装 @nestjs/cli
npm i -g @nestjs/cli
(2) 创建项目
建议选择Yarn进行安装
nest new 02-nestjs-mongoose-docker
二、 ⬇️ 安装依赖
yarn add @nestjs/mongoose
yarn add @nestjs/config
yarn add mongoose
@nestjs/mongoose 只是 Nest 的 Mongoose 适配器,因此我仍需要安装 Mongoose
三、 🔧 配置环境变量
新建.env
文件
# mongo 地址
MONGO_URI=mongodb://localhost
# mongo 数据库名称
MONGO_DB_NAME=test
# mongo 端口
MONGO_PORT=27017
# mongo 用户名
MONGO_USER=root
# mongo 密码
MONGO_PASS=password
# mongo 挂载地址
MONGO_VOLUMES=~/DockerData/02-nestjs-mongoose-docker/data/db
# mongo 授权源
MONGO_AUTH_SOURCE=admin
四、 🆕 创建 ConfigService
(1) IConfig
新建src/config/config.interface.ts
文件
提供类型定义,完善TS提示
/** 环境变量 */
export type IEnv = {
MONGO_URI: string;
MONGO_DB_NAME: string;
MONGO_PORT: number;
MONGO_USER: string;
MONGO_PASS: string;
MONGO_VOLUMES: string;
MONGO_AUTH_SOURCE: string;
};
/** 配置 */
export type IConfig = IEnv;
(2) setupConfig
新建src/config/config.setup.ts
import { ConfigModule } from '@nestjs/config';
// 根据 NODE_ENV 读取环境变量文件
export const envFilePath = process.env.NODE_ENV
? `.env.${process.env.NODE_ENV}`
: '.env';
// 封装 setupConfig 方法,configModule 的配置将在此处完成
export const setupConfig = () => {
return ConfigModule.forRoot({ envFilePath });
};
五、🧙 docker-compose
推荐使用 docker-compose 的方式来构建我们的项目,方便一键部署
注意:这里的配置只启动的 Mongo 容器,如需启动 Nest 项目,请另加配置
(1) 配置
根目录下新建docker-compose.yml
文件, 其中${ENV_NAME}
是用于插入我们的配置的环境变量
version: '3.9'
services:
mongo:
# 镜像名
image: mongo
# 端口
ports:
# 容器暴露端口(我们自定义):容器内部端口(通常固定)
- ${MONGO_PORT}:27017
environment:
# 初始root用户名
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
# 初始root密码
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASS}
# 挂载磁盘卷,目的为了数据库数据持久化,否则容器停止后将丢失数据
volumes:
- ${MONGO_VOLUMES}:/data/db
(2) 检查
检查输出的配置,避免错误造成重复执行部署命令(很浪费时间)
docker-compose --env-file .env config
(3) 部署
docker-compose --env-file .env up -d
-d
使其后台运行--env-file
为环境变量文件
六、🔧 配置mongoose连接
新建src/db/mongoose.setup.ts
,编写一个连接mongodb的方法
- 导入了 @nestjs/config 和 @nestjs/mongoose 模块
- 定义了setupMongodb函数,为之后连接使用
- 使用 ConfigModule 导入配置信息
- 从 ConfigService 中获取环境变量
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MongooseModule, MongooseModuleOptions } from '@nestjs/mongoose';
import { IConfig } from 'src/config/config.interface';
export const setupMongodb = () => {
// 从configService中获取环境变量,并连接mongo
return MongooseModule.forRootAsync({
// 引入 ConfigModule 模块
imports: [ConfigModule],
// 从 ConfigService 中读取配置,并且最终 return 给 useFactory 回调方法,此方法将使用我们的配置去链接 Mongodb
useFactory: (configService: ConfigService<IConfig>) => {
const mongooseOptions: MongooseModuleOptions = {
uri: configService.get('MONGO_URI'),
dbName: configService.get('MONGO_DB_NAME'),
user: configService.get('MONGO_USER'),
pass: configService.get('MONGO_PASS'),
authSource: configService.get('MONGO_AUTH_SOURCE'),
};
return mongooseOptions;
},
// 注入 ConfigService
inject: [ConfigService],
});
};
七、🔗连接
装载我们封装好的 Config 和 Mongodb
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { setupConfig } from './config/config.setup';
import { setupMongodb } from './db/mongodb.setup';
@Module({
imports: [
// 装载 config
setupConfig(),
// 装置 mongodb
setupMongodb(),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
🔚 验证
yarn start
运行,看到此结果即连接成功