0

0

聊聊node中怎么使用Nest.js 连接 MongoDB 数据库

青灯夜游

青灯夜游

发布时间:2022-01-26 17:52:28

|

4086人浏览过

|

来源于掘金社区

转载

node中怎么使用nest.js 连接 mongodb 数据库?下面本篇文章给大家介绍一下node 框架 nest.js 使用 mongodb 的方法,希望对大家有所帮助!

聊聊node中怎么使用Nest.js 连接 MongoDB 数据库

在学习 Nest 与数据库进行连接时,难免会遇到选择数据库的问题,这里作者选择的是 MongoDB 记录一下简单使用。 大家可以根据不同需求选择合适的数据库。

贴出跟进看的文档以方便大家进一步学习 Nest 中文文档 ,MongoDB菜鸟教程


数据库简介

  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

  • MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

数据库选择

  • 目前市面上有很多成熟的数据库可供大家选择。

1.png

  • 据翻看各种资料作者这里得出的结论为大项目用 PostgreSql 小项目用 MongoDB 所以作者准备一起学习下,这次因为想做一个小项目练练手所以先用 MongoDB 看看怎么样。
  • 大家有不同看法欢迎在评论区讨论。

配置基本服务

  • 确保电脑已经安装了 MongoDB

  • 记得弄完做一下环境配置,可以开机自启, 也可以选择自己启动哈hhh看个人

Mongoose

  • 简单介绍一下 , Mongoose 是一个操作 MongoDBNodejs 驱动库

  • MongoDB 是数据库,Nodejs 是js的一个运行环境,Nodejs 不直接操作 Mongodb,这个时候就需要相应的驱动程序来提供接口。

  • 在 Nest 项目中安装一下依赖项,两种安装方式,自行选择

     $ npm install --save @nestjs/mongoose mongoose  // NPM 安装
     $ yarn add @nestjs/mongoose mongoose  // YARN 安装复制代码
  • 安装完成后我们在 AppModule 文件中引入一下

     /* app.module.ts */
    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    // 我自己准备的 USER 模块
    import { UserModule } from './user/user.module';
    // 引入 Mongoose 
    import { MongooseModule } from '@nestjs/mongoose';
    @Module({
      // 用 forRoot 方法连接数据库
      imports: [UserModule, MongooseModule.forRoot('mongodb://localhost/test')],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}

基础功能模块

  • 这里用一个 User 模块来做 demo

  • 这里我理解的基础功能模块包括 module(模块) Controller(控制器) Service(提供者) Schema(数据模型) 我们主要是用 Nest对 MongoDB 做增删改查 这几个模块目前暂时够用。

  • 对这几个模块做一些简单介绍:

2.png

  • 由于我们上面已经对 app.module.ts 该根模块已经引入过了 mongoose 所以下面我们之间看一下功能模块是怎样的

Schema

  • Mongoose中,一切都源于 Scheme,每个 Schema 都会映射到 MongoDB 的一个集合,并定义集合内文档的结构。Schema 被用来定义模型,而模型负责从底层创建和读取 MongoDB 的文档。

  • Schema 可以用 NestJS 内置的装饰器来创建,或者也可以自己动手使用 Mongoose常规方式。使用装饰器来创建 Schema 会极大大减少引用并且提高代码的可读性。这里作者用的是官方推荐方式用装饰器来创建,毕竟用的是 Nest 不得用点特色的hhh。

  •   /* user.schema.ts */
       import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
      // @Prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子
      // SchemaFactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 Schema 对象
      import { Document } from 'mongoose';
      export type UserDocument = User & Document;
      @Schema()
      export class User extends Document {
        @Prop()
        name: string;
        // 设置值为必填
        @Prop({ required: true })
        age: number;
        @Prop()
        height: number;
      }
      export const UserSchema = SchemaFactory.createForClass(User);
  • 等下和其他功能一起在 Module 中引入。

Service

  • 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。

        /* user.service.ts */
        import { Model } from 'mongoose';
        import { InjectModel } from '@nestjs/mongoose';
        import { User, UserDocument } from 'src/schema/user.schema';
        import { CreateUserDto } from './user.dto';
        @Injectable()
        export class UserService {
          // 注册Schema后,可以使用 @InjectModel() 装饰器将 User 模型注入到 UserService 中:
            constructor(@InjectModel('User') private userTest: Model<UserDocument>) {}
              // 添加
              async create(createUserDto: CreateUserDto): Promise<User> {
                const createUser = new this.userTest(createUserDto);
                const temp = await createUser.save();
                return temp;
              }
              // 查找
              async findAll(): Promise<User[]> {
                // 这里是异步的
                const temp = await this.userTest.find().exec();
                return temp;
              }
              // 查找
              async findOne(name: string): Promise<User[]> {
                // 这里是异步的
                const temp = await this.userTest.find({ name });
                return temp;
              }
              // 删除
              async delete(sid: number) {
                // 这里是异步的  remove 方法删除成功并返回相应的个数
                const temp = await this.userTest.remove({ _id: sid });
                return temp;
              }
              // 修改
              async updateUser(sid: string, data: any) {
                // 这里是异步的  remove 方法删除成功并返回相应的个数
                const temp = await this.userTest.updateOne({ _id: sid }, { $set: data });
                return temp;
              }
        }
  • 等下和其他功能一起在 Module 中引入。

Controller

  • 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。

        /* user.controller.ts */
        // 引入 Nest.js 内置的各个功能
        import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
        // 引入用户服务
        import { UserService } from './user.service';
        // 引入创建用户 DTO 用于限制从接口处传来的参数
        import { CreateUserDto } from './user.dto';
        // 配置局部路由
        @Controller('user')
        export class UserController {
          constructor(private readonly userService: UserService) {}
          // 创建user路由 user/createUser
          @Post('createUser')
          async createUser(@Body() body: CreateUserDto) {
            return this.userService.create(body);
          }
          //查找所有 user 路由
          @Get('findAll')
          async findAll() {
            return this.userService.findAll();
          }
          // 查找某一个用户路由
          @Get('findOne')
          async findOne(@Query() query: any) {
            return this.userService.findOne(query.name);
          }
          // 删除一个用户的路由
          @Delete(':sid')
          deleteUser(@Param() param: any) {
            return this.userService.delete(param.sid);
          }
          // 更改用户信息的路由
          @Put(':sid')
          updateUser(@Body() body: any, @Param() param: any) {
            return this.userService.updateUser(param.sid, body);
          }
        }

Moudle

  • 模块是具有 @Module() 装饰器的类。 @Module() 装饰器提供了元数据,Nest 用它来组织应用程序结构。

  • 我们把以上内容引入到我们的 User 模块中

        /* user.module.ts */
        import { Module } from '@nestjs/common';
        import { UserController } from './user.controller';
        import { UserService } from './user.service';
        import { MongooseModule } from '@nestjs/mongoose';
        import { UserSchema } from 'src/schema/user.schema';
        @Module({
           // MongooseModule提供了forFeature()方法来配置模块,包括定义哪些模型应该注册在当前范围中。
           // 如果你还想在另外的模块中使用这个模型,将MongooseModule添加到CatsModule的exports部分并在其他模块中导入CatsModule。
           // 这里的 name:'User' 为数据库表名称与 service 中注入的表名称对应两者不一样会报错
          imports: [MongooseModule.forFeature([{ name: 'User', schema: UserSchema }])],
          controllers: [UserController],
          providers: [UserService],
        })
        export class UserModule {}
    • 以上我们的基础布局完成,可以进行接口检验了

接口检验

  • 处理这些配置我们还在 main.ts 文件中配置了全局路由 app.setGlobalPrefix('api'); 意思就是所有请求前面会有一个 /api/
  • 这里我们用的 PostManMongoDB Compass 官方推荐的可视化工具查看效果

POST 增

  • 这里我使用 POST 请求,路由为/api/user/createUser 因为要限制请求参数的数据类型所以这里方式为 application/json

  • 因为这里我们之前定义的 User 数据模型为 name,age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中

  • Postman

3.png

闪念贝壳
闪念贝壳

闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

下载
  • 打开 MongoDB Compass 查看数据

4.png

  • 可以看到我们已经添加到数据库中一条数据,接下来我们在添加两条,方便等会的查询/删除/更改操作

GET 查所有

  • 这里我使用 GET 请求,,路由为/api/user/findAll 因为这里是查 User 集合内所有数据,所以不用添加请求参数

  • Postman

    5.png

  • 打开 MongoDB Compass 查看数据

6.png

  • 可以看到我们已经查询到数据库中刚才在 User 集合中添加的三条数据切记要点 REFRESH 建不然软件不会自己刷新

GET 查单个用户

  • 这里我使用 GET 请求,路由为/api/user/findOne 因为这里是查 User 集合内对应搜索条件的数据集合,这里我们用的是name 去查询的。也可以用唯一值 id 去查询。

  • Postman

7.png

  • 可以看到返回结果是一个集合,了解更多查询方式可以看下官网

PUT 改

  • 这里我使用 PUT 请求,路由为/api/user/:sid 因为要限制请求参数的数据类型所以这里方式为 application/json

  • 因为这里我们之前定义的 User 数据模型为 age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中,我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a 传入 Param 中 ,然后把要修改的内容放入 Body  中

  • Postman

    8.png

  • 打开 MongoDB Compass 查看数据

9.png

  • 可以看到我们已经把小明的年龄与身高做了修改

DELETE 删

  • 这里我使用 DELETE 请求,路由为/api/user/:sid 因为要限制请求参数的数据类型所以这里方式为 application/json

  • 我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a 传入 Param 中 ,并发起请求

  • Postman

10.png

  • 打开 MongoDB Compass 查看数据

11.png

  • 可以看到小明的信息已经不存在了

总结

  • 至此我们已经完成在 Nest.js 中使用 MongooseMongoDB 数据的基础操作。并完成了在 Nest 中使用装饰器来创建 数据模型 Schema
  • 看文档好像还可以使用 Nest 中内置的TypeORM 来创建模型感兴趣的小伙伴可以去看一下。回头我学习其他数据库连接时在去翻阅看看怎么操作下。
  • Nest 要学的还有很多,管道,中间件,拦截器,路由守卫等,这些我是准备在写小 demo 中去使用来加深个人理解,不然只是单纯的看文档,难以理解,这里就先不赘述了~  目前我知道的就是用管道做请求类型判断是很香的hhh感兴趣的小伙伴可以去了解下类验证器

更多node相关知识,请访问:nodejs 教程

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 7.3万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 21.8万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号