NestJs 手摸手之《Mongoose+Docker》

725 阅读2分钟

《👋 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

运行,看到此结果即连接成功 image.png