搜尋
首頁web前端js教程聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

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


数据库简介

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

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

数据库选择

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

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • 据翻看各种资料作者这里得出的结论为大项目用 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 做增删改查 这几个模块目前暂时够用。

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

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • 由于我们上面已经对 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(&#39;User&#39;) 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 &#39;@nestjs/common&#39;;
        // 引入用户服务
        import { UserService } from &#39;./user.service&#39;;
        // 引入创建用户 DTO 用于限制从接口处传来的参数
        import { CreateUserDto } from &#39;./user.dto&#39;;
        // 配置局部路由
        @Controller(&#39;user&#39;)
        export class UserController {
          constructor(private readonly userService: UserService) {}
          // 创建user路由 user/createUser
          @Post(&#39;createUser&#39;)
          async createUser(@Body() body: CreateUserDto) {
            return this.userService.create(body);
          }
          //查找所有 user 路由
          @Get(&#39;findAll&#39;)
          async findAll() {
            return this.userService.findAll();
          }
          // 查找某一个用户路由
          @Get(&#39;findOne&#39;)
          async findOne(@Query() query: any) {
            return this.userService.findOne(query.name);
          }
          // 删除一个用户的路由
          @Delete(&#39;:sid&#39;)
          deleteUser(@Param() param: any) {
            return this.userService.delete(param.sid);
          }
          // 更改用户信息的路由
          @Put(&#39;:sid&#39;)
          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 &#39;@nestjs/common&#39;;
        import { UserController } from &#39;./user.controller&#39;;
        import { UserService } from &#39;./user.service&#39;;
        import { MongooseModule } from &#39;@nestjs/mongoose&#39;;
        import { UserSchema } from &#39;src/schema/user.schema&#39;;
        @Module({
           // MongooseModule提供了forFeature()方法来配置模块,包括定义哪些模型应该注册在当前范围中。
           // 如果你还想在另外的模块中使用这个模型,将MongooseModule添加到CatsModule的exports部分并在其他模块中导入CatsModule。
           // 这里的 name:&#39;User&#39; 为数据库表名称与 service 中注入的表名称对应两者不一样会报错
          imports: [MongooseModule.forFeature([{ name: &#39;User&#39;, 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

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • 打开 MongoDB Compass 查看数据

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

GET 查所有

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

  • Postman

    聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • 打开 MongoDB Compass 查看数据

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

GET 查单个用户

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

  • Postman

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

PUT 改

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

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

  • Postman

    聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • 打开 MongoDB Compass 查看数据

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

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

DELETE 刪除

  • 這裡我使用DELETE 請求,路由為/api/user/:sid#因為要限制請求參數的資料型別所以這裡方式為application/json

  • #我們這裡傳入資料庫中小明的_id 61eea1b4144ea374a5b8455a傳入Param 中,並發起請求

  • Postman

聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • ##開啟MongoDB Compass 查看資料

1聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫

  • #可以看到小明的資訊已經不存在了

總結

更多node相關知識,請造訪:

nodejs 教學

以上是聊聊node中怎麼使用Nest.js 連接 MongoDB 資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
node、nvm与npm有什么区别node、nvm与npm有什么区别Jul 04, 2022 pm 04:24 PM

node、nvm与npm的区别:1、nodejs是项目开发时所需要的代码库,nvm是nodejs版本管理工具,npm是nodejs包管理工具;2、nodejs能够使得javascript能够脱离浏览器运行,nvm能够管理nodejs和npm的版本,npm能够管理nodejs的第三方插件。

Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

node导出模块有哪两种方式node导出模块有哪两种方式Apr 22, 2022 pm 02:57 PM

node导出模块的两种方式:1、利用exports,该方法可以通过添加属性的方式导出,并且可以导出多个成员;2、利用“module.exports”,该方法可以直接通过为“module.exports”赋值的方式导出模块,只能导出单个成员。

安装node时会自动安装npm吗安装node时会自动安装npm吗Apr 27, 2022 pm 03:51 PM

安装node时会自动安装npm;npm是nodejs平台默认的包管理工具,新版本的nodejs已经集成了npm,所以npm会随同nodejs一起安装,安装完成后可以利用“npm -v”命令查看是否安装成功。

node中是否包含dom和bomnode中是否包含dom和bomJul 06, 2022 am 10:19 AM

node中没有包含dom和bom;bom是指浏览器对象模型,bom是指文档对象模型,而node中采用ecmascript进行编码,并且没有浏览器也没有文档,是JavaScript运行在后端的环境平台,因此node中没有包含dom和bom。

聊聊V8的内存管理与垃圾回收算法聊聊V8的内存管理与垃圾回收算法Apr 27, 2022 pm 08:44 PM

本篇文章带大家了解一下V8引擎的内存管理与垃圾回收算法,希望对大家有所帮助!

聊聊Node.js path模块中的常用工具函数聊聊Node.js path模块中的常用工具函数Jun 08, 2022 pm 05:37 PM

本篇文章带大家聊聊Node.js中的path模块,介绍一下path的常见使用场景、执行机制,以及常用工具函数,希望对大家有所帮助!

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),