Nestjs框架: 集成 TypeORM 和 Mongoose

Nestjs框架: 多租户与多数据库的架构设计与实现 本文介绍了在NestJS项目中实现多数据库对接的方案,重点解决多租户架构下的数据隔离与灵活切换需求。通过抽象层统一接口,结合TypeORM、Prisma和Mongoose三种ORM库,支持MySQL、PostgreSQL和MongoDB等多种数据库类型。方案采用外观模式+抽象工厂模式+策略模式,通过DatabaseModule集中管理数据库连接,根据租户ID动态切换不同数据库配置。文章详细阐述了环境变量设计、目录结构和模块实现,为复杂业务场景下的多数据库管理提供了可行方案。 阅读详情

概述

  • 虽然 Prisma 用起来非常舒服,不需要创建 repository,它就能实现很好的数据库连接
  • 同时,它对 TypeScript 的支持也非常出色
  • 不过,在一些极端应用场景下,尤其是在关键性数据库方面,TypeORM 的兼容性比某些其他工具要好。

集成 TypeORM


1 ) 安装依赖

  • $ $ npm install --save @nestjs/typeorm typeorm mysql2

2 ) 配置

环境变量 .env 的配置

DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=example
DB_DATABASE=testdb
DB_AUTOLOAD=true
DB_SYNC=true

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { User } from './user/user.entity';

@Module({
  imports: [
    // 下面这个后续可以封装一个新的模块,来匹配 .env 和 其他配置
    ConfigModule.forRoot({  // 配置环境变量模块 
      envFilePath: '.env', // 指定环境变量文件路径 
      isGlobal: true, // 全局可用 
    }), 
    TypeOrmModule.forRootAsync({
      inject:[ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: configService.get<string>('DB_TYPE'),
        host: configService.get<string>('DB_HOST'),  
        port: configService.get<number>('DB_PORT'),  
        username: configService.get<string>('DB_USERNAME'),  
        password: configService.get<string>('DB_PASSWORD'),  
        database: configService.get<string>('DB_DATABASE'),
        autoLoadEntities: Boolean(configService.get<string | boolean>('DB_AUTOLOAD', false)), 
        synchronize: Boolean(configService.get<string | boolean>('DB_SYNC', false)), 
      } as TypeOrmModuleOptions),
    }),
    TypeOrmModule.forFeature([User]),
  ],
  controllers: [AppController],
  providers: []
})

export class AppModule {} 
  • 它是通过创建 TypeOrmModule.forRootSync 并传入数据库连接配置来实现与数据库的连接
  • 配置完成后,就可以创建对应的实体,比如创建 user 实体

3 ) 创建实体

src/user/user.entity

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
	@PrimaryGeneratedColumn()
	id: number;

	@Column()
	username: string;

	@Column()
	password: string;
}

4 ) 编辑测试控制器

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user/user.entity';
import { Repository } from 'typeorm';

@Controller()
export class AppController {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  @Get()
  async getUsers(): Promise<any> {
    const rs = await this.userRepository.find();
    return rs;
  }
}
  • 打开浏览器访问 localhost:3030/,得到的结果和预期一致
  • 至此,TypeORM 的集成就算完成了

集成 Mongoose


1 ) 安装

  • $ npm i @nestjs/mongoose mongoose

2 ) 配置 app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './user/user.schema'
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    // 下面这个后续可以封装一个新的模块,来匹配 .env 和 其他配置
    ConfigModule.forRoot({  // 配置环境变量模块 
      envFilePath: '.env', // 指定环境变量文件路径 
      isGlobal: true, // 全局可用 
    }),
    MongooseModule.forRootAsync({
      inject: [ConfigService], // 注入配置服务
      useFactory: async (configService: ConfigService) => ({ 
        uri: configService.get('MONGODB_URI'),  // 从配置服务中获取连接字符串 
      }), 
      
    }),
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])
  ],
  controllers: [AppController],
  providers: [],
})

export class AppModule {}

3 ) 新建 mongo 服务

docker-compose.mongo.yaml

services:
	mongo:
		image: mongo
		restart: always
		environment:
			MONGO_INITDB_ROOT_USERNAME: root
			MONGO_INITDB_ROOT_PASSWORD: example
		ports:
			- 27018: 27017
			
	mongo-express:
		image: mongo-express
		restart: always
		environment:
			ME_CONFIG_MONGODB_ADMINUSERNAME: root
			ME_CONFIG_MONGODB_ADMINPASSWORD: example
			ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
			ME_CONFIG_BASICAUTH: false
		ports:
			- 8081:8081
  • $ docker compose -f docker-compose.mongo.yml up -d
  • 进入

4 ) 创建数据库

  • 打开 8081 UI 界面, 创建一个名称为 nest 的数据库

5 )编辑 user 相关 schema

src/user/user.schema.ts

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';

export type UserDocument = HydratedDocument<User>;

@Schema()
export class User {
	@Prop()
	username: string;
	
	@Prop()
	password: string;
}
export const UserSchema = SchemaFactory.createForClass(User);

6 ) 控制器的配置

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './user/user.schema';
import { Model } from 'mongoose';

@Controller()
export class AppController {
  constructor(
    @InjectModel(User.name)
    private userModel: Model<User>
  ) {}

  @Get()
  async getUsers(): Promise<any> {
    const rs = await this.userModel.find()
    return rs;
  }
}

7 ) 创建数据并测试

添加测试数据

  • 打开 8081 UI 界面, 在 nest 数据库中,新增 相关 collection, 如新建 users,这里后面多加 s
  • 之后,自行添加 document, 注意 “_id” 不要动,添加 username 和 password 字段就行

为管理员账号分配权限

  • $ docker ps | grep mongo 找到容器名
  • $ docker exec -it nestjs-starter-mongo-1 mongosh -u root -p 之后,输入密码
  • $ show dbs;
  • $ use nest;
  • $ db.createUser({user: 'root', pwd: 'example', roles: [{role: 'dbOwner', db: 'nest'}]})
    • 如果返回 { ok : 1 } 就成功了

测试

  • localhost:3030/
  • 能返回数据,就成功了

当然,也可按照文档上,另一种方式来配置 Schema 和 其他, 如下:

集成 Mongoose 方式2


1 ) 修改 app.module.ts

MongooseModule.forFeature([{ name: 'User', schema: UserSchema }])

这里的 User 和 下面的 User 字符串都可以单独定义出来成一个常量

2 ) 修改 user/user.schema.ts

import mongoose, { Document } from 'mongoose';

export interface User extends Document {
  name: string;
  password: string;
}

export const UserSchema = new mongoose.Schema(
	{
		username: String,
		password: String,
	},
	{ collection: 'users' },
);

或

import mongoose from 'mongoose';

export const UserSchema = new mongoose.Schema(
	{
		username: String,
		password: String,
	},
	{ collection: 'users' },
);

3 ) 修改 app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './user/user.schema';
import { Model } from 'mongoose';

@Controller()
export class AppController {
  constructor(
    @InjectModel('User')
    private userModel: Model<User>
  ) {}

  @Get()
  async getUsers(): Promise<any> {
    const rs = await this.userModel.find()
    return rs;
  }
}

或

import { Controller, Get } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model, Document as Doc } from 'mongoose';

@Controller()
export class AppController {
  constructor(
    @InjectModel('User')
    private userModel: Model<Doc>
  ) {}

  @Get()
  async getUsers(): Promise<any> {
    const rs = await this.userModel.find()
    return rs;
  }
}
  • 这里的 User 字符串可以单独定义出去,形成一个变量

深入 mongoose 原理

  • @nestjs/mongoose 这个官方的包

  • 进入 lib 目录,查看 index.ts

    export * from './common';
    export * from './decorators';
    export * from './errors';
    export * from './factories';
    export * from './interfaces';
    export * from './mongoose.module';
    export * from './pipes';
    export * from './utils';
    
  • 可以看到它导出来很多方法

  • 先看 decorators 目录

    • 其中有两个装饰器非常重要,一个叫做 schema.decorator.ts
    • 第二个叫 prop.decorator.ts,这两个装饰器让 @nestjs/mongoose
    • 更加贴合于 NestJS 的设计思想,代码的可读性更强。
  • 在 schema.decorator.ts 中

    import * as mongoose from 'mongoose';
    import { TypeMetadataStorage } from '../storages/type-metadata.storage';
    
    /**
     * Interface defining schema options that can be passed to `@Schema()` decorator.
     */
    export type SchemaOptions = mongoose.SchemaOptions;
    
    /**
     * @Schema decorator is used to mark a class as a Mongoose schema.
     * Only properties decorated with this decorator will be defined in the schema.
     * 
     * @publicApi
     */
    export function Schema(options?: SchemaOptions): ClassDecorator {
      return (target: Function) => {
        TypeMetadataStorage.addSchemaMetadata({
          target,
          options,
        });
      };
    }
    
  • 这里调用 TypeMetadataStorage.addSchemaMetadata 方法

  • 进入 TypeMetadataStorage 这里可知,这里是一个工具集合,进入 addSchemaMetadata

    addSchemaMetadata(metadata: SchemaMetadata) {
    	this.compileClassMetadata(metadata);
    	this.schemas.push(metadata);
    }
    
    • 这里metadata就是我们定义的 schema 被添加到 schemas 数组中
  • 进入 moogoose.module.ts 核心模块,有两个核心方法

    • MongooseCoreModule.forRoot
    • createMongooseProviders
  • 进入 moggoose.providers.ts 核心代码在这里

    {
        provide: getModelToken(option.name, connectionName),
        useFactory: (connection: Connection) => {
          const model = connection.models[option.name]
            ? connection.models[option.name]
            : connection.model(option.name, option.schema, option.collection);
          return model;
        },
        inject: [getConnectionToken(connectionName)],
    }
    
    • 注意,完整代码是递归执行,里面很可能是 schema 套 schema
  • 这里对应,https://mongoosejs.com 官网的这段代码

    const mongoose = require('mongoose');
    mongoose.connect('mongodb://127.0.0.1:27017/test');
    
    const Cat = mongoose.model('Cat', { name: String });
    
    const kitty = new Cat({ name: 'Zildjian' });
    kitty.save().then(() => console.log('meow'));
    
    • 上述原理代码代表了如何查找到相关的表
  • 再看 mongoose-core.module.ts 最核心的代码

    const connectionProvider = {
      provide: mongooseConnectionName,
      useFactory: async (): Promise<any> =>
        await lastValueFrom(
          defer(async () =>
            mongooseConnectionFactory(
              await this.createMongooseConnection(uri, mongooseOptions, {
                lazyConnection,
                onConnectionCreate,
              }),
              mongooseConnectionName,
            ),
          ).pipe(
            handleRetry(retryAttempts, retryDelay, verboseRetryLog),
            catchError((error) => {
              throw mongooseConnectionError(error);
            }),
          ),
        ),
    };
    
    • 核心在这里, createMongooseConnection, 它具体就是调用 mongoose.createConnection 创建一次连接
  • 进入 createMongooseConnection

      private static async createMongooseConnection(
        uri: string,
        mongooseOptions: ConnectOptions,
        factoryOptions: {
          lazyConnection?: boolean;
          onConnectionCreate?: MongooseModuleOptions['onConnectionCreate'];
        },
      ): Promise<Connection> {
        const connection = mongoose.createConnection(uri, mongooseOptions);
    
        if (factoryOptions?.lazyConnection) {
          return connection;
        }
    
        factoryOptions?.onConnectionCreate?.(connection);
    
        return connection.asPromise();
      }
    
      async onApplicationShutdown() {
        const connection = this.moduleRef.get<any>(this.connectionName);
        if (connection) {
          await connection.close();
        }
      }
    }
    
    • 这里最核心的就是 调用 mongoose.createConnection 创建一次连接并返回
    • 这里的 lazyConnection 是可选配置,这里叫做延迟创建,用于改善性能
  • 以上的代码流程,后续可以详细研究下

NestJS模块化架构与依赖注入实战指南 模块化架构是现代软件开发的核心设计模式,通过将系统拆分为高内聚、低耦合的功能单元,显著提升代码的可维护性和可扩展性。NestJS作为渐进式Node.js框架,创新性地将前端领域成熟的装饰器语法和依赖注入(DI)模式引入后端开发,大幅降低了全栈开发的学习曲线。其模块系统支持显式声明依赖关系,配合TypeScript的强类型特性,为构建企业级应用提供了坚实基础。在实际工程实践中,这种架构特别适合电商平台、SaaS系统等复杂业务场景,能有效管理随着业务增长带来的复杂度。通过合理运用NestJS的模块化设计和DI容 阅读详情

相关推荐

primetime如何做voltage scaling

存在这样的情况,标准单元库只有ssgnp0p72vm40c和ssgnp0p9vm40c的libs,但是我们希望它工作在ssgnp0p76vm40c,这样的话就需要用ssgnp0p72vm40c和ssgnp0p9vm40c的libs来scaling出ssgnp0p76vm40c的lib。

qq_34326957的博客 1685

NodeJS-NestJS:TypeORM 连接mysql数据库,增删改查

NestJS:TypeORM 连接mysql数据库,增删改查

snow的博客 4359

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7173

nestjs[typeorm学习之基本的增删查改操作]

第一种方式简单粗暴,直接使用EntityManager(实体管理器)或Repository(存储库)的query()方法执行拼接出来的sql语句即可,就如同在数据库执行一样,这种方式非常自由,但是比较麻烦而已,但有必要知道与使用,因为保不准什么时候就会需要。看完之后倒是有不少的了解,但是心中也有了不少问题,比如:为什么一种查询方式(如:获取数据列表)可以有多种的操作方案(1、query(sql语句),2、find(),3、QueryBuilder方式,4…一个简单的单表而已,没有任何其他麻烦的内容。

墨水白云的博客 5422

搭建问答系统

数据描述 import docx import jieba from gensim.models import Word2Vec import os import numpy as np import pickle as pk import warnings from copy import deepcopy warnings.filterwarnings("ignore") from mu...

微信号:RunsenLiu 1843

趋势跟踪策略

/ 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred);

2401_84919512的博客 356

NestJs 中使用 mongoose

在NestJs使用mongoose的知识点

qq_33003143的博客 1851

【Zephyr存储专题】09_LittleFs文件系统操作

本文档旨在为开发者介绍Zephyr下Littlef's文件系统相关配置使用指南

zero的博客 3246

NestJS通过TypeORM框架连接MongoDB根据主键查询返回空

最近刚上手NestJS,想通过NestJS与mongoDB实现一个小功能,刚上手就碰到根据主键id查询返回为空的问题。import {/*** 主键/*** 应用名称/*** 应用备注* 创建时间/*** 更新时间/*** 创建人员id/*** 创建人员名称/*** 更新人员id/*** 更新人员名称其中主键就是字段id作者刚接触typeScrpt以及nestjs,这个是暂时能找到的方法,如果你有更好的方案,欢迎评论区讨论。

fpy229的博客 641

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1673

超简单五步实现VOS3000客户端呼入配置

1.查看SIP代理  在注册管理中查看自己线路注册的SIP代理IP地址,记录下来。 2.创建普通账户  创建一个呼入使用的普通账号,选择“计费费率”,根据自己情况选择费率,这里做测试就配置了免费的费率,如果费率不是免费,需要给这个普通账户充值。 3.新建对接网关 新建一个对接网关,点击该网关的“补充设置”,选择“网关类型”为静态IP,然后在IP地址栏填上刚才在注册管理里面记录的SIP代...

非著名运维的博客 1万+

Nestjs成长足迹(二):TypeORM操作数据库、Pipe校验参数

本文章记录自己学习Nest的过程,适于前端及对后端没有基础但对Nest感兴趣的同学,如有错误,欢迎各位大佬指正在开始本文的正式内容前,先梳理一下项目的目录结构,本项目使用了与我前面发文使用koa2写接口的一般步骤相似的目录架构,主要就是servicesmodulesdtoentities这几个重要目录在上一篇文章,已经初步介绍了Nest以及其swagger文档的使用,那么本篇便开始讲述Nest如何连接数据库、在创建实体中使用Pipe管道进行参数校验用于多对多关系,使用后会由TypeORM。

Kylin的博客 1857

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3100

NestJS数据库集成指南:TypeORM与Mongoose最佳实践

NestJS数据库集成指南:TypeORM与Mongoose最佳实践 【免费下载链接】nest A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications w...

gitblog_00184的博客 952

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

NestJS数据库集成实战:TypeORM与Mongoose从配置到优化全指南

你还在为Node.js后端开发中的数据库集成感到困扰吗?作为一款渐进式Node.js框架,NestJS(Nest JavaScript框架)凭借其模块化架构和TypeScript支持,已成为构建企业级应用的首选方案。本文将通过实战案例,详解如何在NestJS项目中无缝集成关系型数据库(TypeORM)和非关系型数据库(Mongoose),帮你掌握配置技巧、实体定义和性能优化的最佳实践。读完本文,你...

gitblog_01086的博客 353

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Nestjs框架: 数据库的多种选择,与单库和多库的分析

NestJS 本身和数据库并无直接关联,它的底层使用 Express 或者 Fastify 来提供 HTTP 接口服务 - 在数据库方面,NestJS 使用 Node.js 端的一些驱动,也就是 NestJS 端的数据库驱动来与数据库进行对接。 - 不过,它更推荐使用一些 ORM(对象关系映射)库来与数据库对接 - 主要原因在于,这些 ORM 库能够与各式各样的数据库进行对接,做到“开箱即用”(out of the box) - 我们无需根据不同的驱动或者不同的数据库去定制不同的逻辑代码 - 官方指出,市

Wang的专栏 1373

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Prisma与TypeORM的对比以及在Nest.js中的优劣点分析

Prisma 是一个现代化的 ORM(对象关系映射工具),旨在简化数据库交互并提高开发效率。它支持多种数据库(如 PostgreSQL、MySQL、SQLite 等),提供了一个类型安全的 API,使得在 TypeScript 中进行数据库查询时,能够避免一些常见的错误。:自动生成的类型安全数据库查询客户端。:一个用于定义数据库模型的 Schema 文件(),定义了模型(即表格)、字段(即列)及其关系。:数据库迁移工具,用于生成和管理数据库的 schema 变更。

CherishTaoTao的博客 1814

NestJS数据访问:构建高效、可扩展的数据层

NestJS数据访问层构建指南:从基础到实践 本文介绍了NestJS框架中数据访问层的实现方案。通过TypeORM等ORM工具,开发者可以高效连接数据库并实现CRUD操作。文章详细讲解了TypeORM的安装配置、实体定义和存储库模式应用,并对比了Sequelize、Mongoose等其他数据访问技术。最佳实践部分强调关注点分离、模块化设计和事务管理的重要性。NestJS丰富的ORM支持配合规范化的开发模式,能够帮助构建可维护的企业级应用数据层。

你若盛开,清风自来 1160

TypeORM ——TypeScript 生态的主流 ORM对比

TypeORM 作为 Node.js/TypeScript 生态的主流 ORM,与其他同类型工具(如 Prisma、Sequelize、Objection.js、Mongoose 等)在设计理念、功能特性和适用场景上存在显著差异。:根据项目阶段(原型/规模化)、团队技术栈(TS/JS、SQL 熟练度)、数据库类型(关系型/NoSQL)综合决策,避免“唯性能论”或“唯流行论”。支持最全面(含多对多中间表管理),关系映射最简洁(自动推断),动态查询最简洁(类型安全),最灵活(完全手写 SQL),

软件行业技术文化交流。 528

网盘项目后端(Nestjs)环境搭建--集成Mongodb、Redis、Swagger配置

好了,基本的弄好了,想着之后弄成Docker Compose(等我再研究研究,docker没学很多)

hsjsjas的博客 1595

前端转全栈:NestJS企业级Node.js框架从入门到实战

Node.js作为服务器端JavaScript运行环境,通过事件驱动和非阻塞I/O模型实现了高性能的Web服务。其模块化架构和丰富的生态系统为后端开发提供了坚实基础。NestJS框架在Node.js基础上,借鉴Angular的模块化思想,结合TypeScript类型系统,为前端开发者提供了平滑的技术栈过渡。该框架采用依赖注入、面向切面编程等企业级设计模式,显著提升了代码的可维护性和可测试性。在实际应用中,NestJS特别适合构建RESTful API、微服务架构和实时应用程序,帮助前端工程师快速掌握后端开发

weixin_30755393的博客 382

NestJS 单体应用跨服务共享事务:nestjs-cls @Transactional 装饰器零侵入实践

nestjs-cls 是一款兼容 NestJS 依赖注入的**继续本地存储(CLS,Async Context)模块**,其官方的 `@nestjs-cls/transactional` 插件能让数据库**事务跨服务无缝共享**:用一个 `@Transactional` 装饰器开启事务,其他 Service 无需任何参数传递即可自动加入同一个事务,实现**零侵入的事务管理**。本文将从安装、注册到

gitblog_00074的博客 1006

NestJS 开源项目教程

NestJS 开源项目教程 【免费下载链接】nest A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications with TypeScript/JavaSc...

gitblog_01093的博客 985

第8章 nestjs服务端开发:通用业务框架设计【数据库】

如何利用上述 generate 生成的 model 生成数据库表?配置用于与日志一对多关系、与角色 roles 多对多关系。注入 User 实体的仓库,并实现用户 CRUD。构造函数注入用户仓库实体类,并实现查询用户详情逻辑。调用用户 service 实现用户的 CRUD。用户Module注入 Logs 实体。应用入口新增 mongodb 配置。设置 DB_SYNC 为 true。应用入库添加数据库连接配置。docker 文件配置。docker 镜像配置。创建用户 Schema。应用入口新增实体配置。

weixin_43800535的博客 622

【2026前端转 AI 全栈指南】第 2 章(下):NestJS 项目创建 · MongoDB 配置 · 项目启动与调试

NestJS概念作用类比前端Module功能模块边界功能文件夹Controller处理 HTTP 路由路由 handlerService业务逻辑依赖注入 DI自动组装依赖不用自己new实例为什么选择 NestJS?什么是 MongoDB?开源文档型 NoSQL 数据库,数据以 BSON/JSON 文档存储,适合简历这种结构灵活的业务。为什么选择 MongoDB?(本教程)简历 JSON 字段随模板变化,文档库比固定表结构省事与 NestJS 通过Mongoose集成成熟。

qq_48032163的博客 489

NestJS Boilerplate 项目数据库操作全指南

还在为NestJS项目的数据库配置和操作而头疼吗?NestJS Boilerplate项目提供了一个完整的企业级解决方案,支持PostgreSQL + TypeORM和MongoDB + Mongoose双数据库架构。本文将深入解析该项目的数据库操作机制,帮助你快速掌握从配置到高级查询的全套技能。 通过本文,你将获得: - ✅ 双数据库架构的深度解析 - ✅ 实体定义和关系映射的最佳实践 - ✅...

gitblog_00579的博客 462
上一篇: Nestjs框架: 集成 Prisma
下一篇: Nestjs框架: 数据库多租户模式与动态模块初探
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值