溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

發(fā)布時(shí)間:2022-01-27 09:34:28 來源:億速云 閱讀:278 作者:柒染 欄目:web開發(fā)

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

在學(xué)習(xí) Nest 與數(shù)據(jù)庫進(jìn)行連接時(shí),難免會(huì)遇到選擇數(shù)據(jù)庫的問題,這里作者選擇的是 MongoDB 記錄一下簡單使用。 大家可以根據(jù)不同需求選擇合適的數(shù)據(jù)庫。

數(shù)據(jù)庫簡介

  • MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

  • MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。

數(shù)據(jù)庫選擇

  • 目前市面上有很多成熟的數(shù)據(jù)庫可供大家選擇。

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 據(jù)翻看各種資料作者這里得出的結(jié)論為大項(xiàng)目用 PostgreSql 小項(xiàng)目用 MongoDB 所以作者準(zhǔn)備一起學(xué)習(xí)下,這次因?yàn)橄胱鲆粋€(gè)小項(xiàng)目練練手所以先用 MongoDB 看看怎么樣。

  • 大家有不同看法歡迎在評(píng)論區(qū)討論。

配置基本服務(wù)

  • 確保電腦已經(jīng)安裝了 MongoDB

  • 記得弄完做一下環(huán)境配置,可以開機(jī)自啟, 也可以選擇自己啟動(dòng)哈hhh看個(gè)人

Mongoose
  • 簡單介紹一下 , Mongoose 是一個(gè)操作 MongoDBNodejs 驅(qū)動(dòng)庫

  • MongoDB 是數(shù)據(jù)庫,Nodejs 是js的一個(gè)運(yùn)行環(huán)境,Nodejs 不直接操作 Mongodb,這個(gè)時(shí)候就需要相應(yīng)的驅(qū)動(dòng)程序來提供接口。

  • 在 Nest 項(xiàng)目中安裝一下依賴項(xiàng),兩種安裝方式,自行選擇

     $ npm install --save @nestjs/mongoose mongoose  // NPM 安裝
     $ yarn add @nestjs/mongoose mongoose  // YARN 安裝復(fù)制代碼
  • 安裝完成后我們?cè)?AppModule 文件中引入一下

     /* app.module.ts */
    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    // 我自己準(zhǔn)備的 USER 模塊
    import { UserModule } from './user/user.module';
    // 引入 Mongoose 
    import { MongooseModule } from '@nestjs/mongoose';
    @Module({
      // 用 forRoot 方法連接數(shù)據(jù)庫
      imports: [UserModule, MongooseModule.forRoot('mongodb://localhost/test')],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}

基礎(chǔ)功能模塊

  • 這里用一個(gè) User 模塊來做 demo

  • 這里我理解的基礎(chǔ)功能模塊包括 module(模塊) Controller(控制器) Service(提供者) Schema(數(shù)據(jù)模型) 我們主要是用 Nest對(duì) MongoDB 做增刪改查 這幾個(gè)模塊目前暫時(shí)夠用。

  • 對(duì)這幾個(gè)模塊做一些簡單介紹:

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 由于我們上面已經(jīng)對(duì) app.module.ts 該根模塊已經(jīng)引入過了 mongoose 所以下面我們之間看一下功能模塊是怎樣的

Schema
  • Mongoose中,一切都源于 Scheme,每個(gè) Schema 都會(huì)映射到 MongoDB 的一個(gè)集合,并定義集合內(nèi)文檔的結(jié)構(gòu)。Schema 被用來定義模型,而模型負(fù)責(zé)從底層創(chuàng)建和讀取 MongoDB 的文檔。

  • Schema 可以用 NestJS 內(nèi)置的裝飾器來創(chuàng)建,或者也可以自己動(dòng)手使用 Mongoose的常規(guī)方式。使用裝飾器來創(chuàng)建 Schema 會(huì)極大大減少引用并且提高代碼的可讀性。這里作者用的是官方推薦方式用裝飾器來創(chuàng)建,畢竟用的是 Nest 不得用點(diǎn)特色的hhh。

  •   /* user.schema.ts */
       import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
      // @Prop 裝飾器接受一個(gè)可選的參數(shù),通過這個(gè),你可以指示這個(gè)屬性是否是必須的,是否需要默認(rèn)值,或者是標(biāo)記它作為一個(gè)常量,下面是例子
      // SchemaFactory 是 mongoose 內(nèi)置的一個(gè)方法做用是讀取模式文檔 并創(chuàng)建 Schema 對(duì)象
      import { Document } from 'mongoose';
      export type UserDocument = User & Document;
      @Schema()
      export class User extends Document {
        @Prop()
        name: string;
        // 設(shè)置值為必填
        @Prop({ required: true })
        age: number;
        @Prop()
        height: number;
      }
      export const UserSchema = SchemaFactory.createForClass(User);
  • 等下和其他功能一起在 Module 中引入。

Service
  • 控制器的目的是接收應(yīng)用的特定請(qǐng)求。路由機(jī)制控制哪個(gè)控制器接收哪些請(qǐng)求。通常,每個(gè)控制器有多個(gè)路由,不同的路由可以執(zhí)行不同的操作。

        /* 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 {
          // 注冊(cè)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 方法刪除成功并返回相應(yīng)的個(gè)數(shù)
                const temp = await this.userTest.remove({ _id: sid });
                return temp;
              }
              // 修改
              async updateUser(sid: string, data: any) {
                // 這里是異步的  remove 方法刪除成功并返回相應(yīng)的個(gè)數(shù)
                const temp = await this.userTest.updateOne({ _id: sid }, { $set: data });
                return temp;
              }
        }
  • 等下和其他功能一起在 Module 中引入。

Controller
  • 控制器的目的是接收應(yīng)用的特定請(qǐng)求。路由機(jī)制控制哪個(gè)控制器接收哪些請(qǐng)求。通常,每個(gè)控制器有多個(gè)路由,不同的路由可以執(zhí)行不同的操作。

        /* user.controller.ts */
        // 引入 Nest.js 內(nèi)置的各個(gè)功能
        import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
        // 引入用戶服務(wù)
        import { UserService } from './user.service';
        // 引入創(chuàng)建用戶 DTO 用于限制從接口處傳來的參數(shù)
        import { CreateUserDto } from './user.dto';
        // 配置局部路由
        @Controller('user')
        export class UserController {
          constructor(private readonly userService: UserService) {}
          // 創(chuàng)建user路由 user/createUser
          @Post('createUser')
          async createUser(@Body() body: CreateUserDto) {
            return this.userService.create(body);
          }
          //查找所有 user 路由
          @Get('findAll')
          async findAll() {
            return this.userService.findAll();
          }
          // 查找某一個(gè)用戶路由
          @Get('findOne')
          async findOne(@Query() query: any) {
            return this.userService.findOne(query.name);
          }
          // 刪除一個(gè)用戶的路由
          @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() 裝飾器提供了元數(shù)據(jù),Nest 用它來組織應(yīng)用程序結(jié)構(gòu)。

  • 我們把以上內(nèi)容引入到我們的 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()方法來配置模塊,包括定義哪些模型應(yīng)該注冊(cè)在當(dāng)前范圍中。
           // 如果你還想在另外的模塊中使用這個(gè)模型,將MongooseModule添加到CatsModule的exports部分并在其他模塊中導(dǎo)入CatsModule。
           // 這里的 name:'User' 為數(shù)據(jù)庫表名稱與 service 中注入的表名稱對(duì)應(yīng)兩者不一樣會(huì)報(bào)錯(cuò)
          imports: [MongooseModule.forFeature([{ name: 'User', schema: UserSchema }])],
          controllers: [UserController],
          providers: [UserService],
        })
        export class UserModule {}
    • 以上我們的基礎(chǔ)布局完成,可以進(jìn)行接口檢驗(yàn)了

接口檢驗(yàn)

  • 處理這些配置我們還在 main.ts 文件中配置了全局路由 app.setGlobalPrefix('api'); 意思就是所有請(qǐng)求前面會(huì)有一個(gè) /api/

  • 這里我們用的 PostManMongoDB Compass 官方推薦的可視化工具查看效果

POST 增
  • 這里我使用 POST 請(qǐng)求,路由為/api/user/createUser 因?yàn)橐拗普?qǐng)求參數(shù)的數(shù)據(jù)類型所以這里方式為 application/json

  • 因?yàn)檫@里我們之前定義的 User 數(shù)據(jù)模型為 name,age,height, 所以請(qǐng)求里面只需要這幾個(gè)參數(shù)即可,別的就算寫進(jìn)去也添加不到集合中

  • Postman

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 打開 MongoDB Compass 查看數(shù)據(jù)

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 可以看到我們已經(jīng)添加到數(shù)據(jù)庫中一條數(shù)據(jù),接下來我們?cè)谔砑觾蓷l,方便等會(huì)的查詢/刪除/更改操作

GET 查所有
  • 這里我使用 GET 請(qǐng)求,,路由為/api/user/findAll 因?yàn)檫@里是查 User 集合內(nèi)所有數(shù)據(jù),所以不用添加請(qǐng)求參數(shù)

  • Postman

    node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 打開 MongoDB Compass 查看數(shù)據(jù)

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 可以看到我們已經(jīng)查詢到數(shù)據(jù)庫中剛才在 User 集合中添加的三條數(shù)據(jù)切記要點(diǎn) REFRESH 建不然軟件不會(huì)自己刷新

GET 查單個(gè)用戶
  • 這里我使用 GET 請(qǐng)求,路由為/api/user/findOne 因?yàn)檫@里是查 User 集合內(nèi)對(duì)應(yīng)搜索條件的數(shù)據(jù)集合,這里我們用的是name 去查詢的。也可以用唯一值 id 去查詢。

  • Postman

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 可以看到返回結(jié)果是一個(gè)集合,了解更多查詢方式可以看下官網(wǎng)

PUT 改
  • 這里我使用 PUT 請(qǐng)求,路由為/api/user/:sid 因?yàn)橐拗普?qǐng)求參數(shù)的數(shù)據(jù)類型所以這里方式為 application/json

  • 因?yàn)檫@里我們之前定義的 User 數(shù)據(jù)模型為 age,height, 所以請(qǐng)求里面只需要這幾個(gè)參數(shù)即可,別的就算寫進(jìn)去也添加不到集合中,我們這里傳入數(shù)據(jù)庫中小明的_id 61eea1b4144ea374a5b8455a 傳入 Param 中 ,然后把要修改的內(nèi)容放入 Body  中

  • Postman

    node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 打開 MongoDB Compass 查看數(shù)據(jù)

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 可以看到我們已經(jīng)把小明的年齡與身高做了修改

DELETE 刪
  • 這里我使用 DELETE 請(qǐng)求,路由為/api/user/:sid 因?yàn)橐拗普?qǐng)求參數(shù)的數(shù)據(jù)類型所以這里方式為 application/json

  • 我們這里傳入數(shù)據(jù)庫中小明的_id 61eea1b4144ea374a5b8455a 傳入 Param 中 ,并發(fā)起請(qǐng)求

  • Postman

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 打開 MongoDB Compass 查看數(shù)據(jù)

node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫

  • 可以看到小明的信息已經(jīng)不存在了

總結(jié)

  • 至此我們已經(jīng)完成在 Nest.js 中使用 Mongoose 對(duì) MongoDB 數(shù)據(jù)的基礎(chǔ)操作。并完成了在 Nest 中使用裝飾器來創(chuàng)建 數(shù)據(jù)模型 Schema 。

  • 看文檔好像還可以使用 Nest 中內(nèi)置的TypeORM 來創(chuàng)建模型感興趣的小伙伴可以去看一下。回頭我學(xué)習(xí)其他數(shù)據(jù)庫連接時(shí)在去翻閱看看怎么操作下。

  • Nest 要學(xué)的還有很多,管道,中間件,攔截器,路由守衛(wèi)等,這些我是準(zhǔn)備在寫小 demo 中去使用來加深個(gè)人理解,不然只是單純的看文檔,難以理解,這里就先不贅述了~  目前我知道的就是用管道做請(qǐng)求類型判斷是很香的hhh感興趣的小伙伴可以去了解下類驗(yàn)證器

關(guān)于node中如何使用Nest.js連接MongoDB數(shù)據(jù)庫問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI