您好,登錄后才能下訂單哦!
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ù)庫。
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ù)庫可供大家選擇。
據(jù)翻看各種資料作者這里得出的結(jié)論為大項(xiàng)目用 PostgreSql
小項(xiàng)目用 MongoDB
所以作者準(zhǔn)備一起學(xué)習(xí)下,這次因?yàn)橄胱鲆粋€(gè)小項(xiàng)目練練手所以先用 MongoDB
看看怎么樣。
大家有不同看法歡迎在評(píng)論區(qū)討論。
確保電腦已經(jīng)安裝了 MongoDB
沒
記得弄完做一下環(huán)境配置,可以開機(jī)自啟, 也可以選擇自己啟動(dòng)哈hhh看個(gè)人
簡單介紹一下 , Mongoose
是一個(gè)操作 MongoDB
的 Nodejs
驅(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 {}
這里用一個(gè) User 模塊來做 demo
這里我理解的基礎(chǔ)功能模塊包括 module
(模塊) Controller
(控制器) Service
(提供者) Schema
(數(shù)據(jù)模型) 我們主要是用 Nest對(duì)
MongoDB
做增刪改查 這幾個(gè)模塊目前暫時(shí)夠用。
對(duì)這幾個(gè)模塊做一些簡單介紹:
由于我們上面已經(jīng)對(duì) app.module.ts 該根模塊已經(jīng)引入過了 mongoose
所以下面我們之間看一下功能模塊是怎樣的
在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 中引入。
控制器的目的是接收應(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 中引入。
控制器的目的是接收應(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); } }
模塊是具有 @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)了
處理這些配置我們還在 main.ts 文件中配置了全局路由 app.setGlobalPrefix('api');
意思就是所有請(qǐng)求前面會(huì)有一個(gè) /api/
這里我們用的 PostMan
和 MongoDB Compass
官方推薦的可視化工具查看效果
這里我使用 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
打開 MongoDB Compass 查看數(shù)據(jù)
可以看到我們已經(jīng)添加到數(shù)據(jù)庫中一條數(shù)據(jù),接下來我們?cè)谔砑觾蓷l,方便等會(huì)的查詢/刪除/更改操作
這里我使用 GET
請(qǐng)求,,路由為/api/user/findAll
因?yàn)檫@里是查 User 集合內(nèi)所有數(shù)據(jù),所以不用添加請(qǐng)求參數(shù)
Postman
打開 MongoDB Compass 查看數(shù)據(jù)
可以看到我們已經(jīng)查詢到數(shù)據(jù)庫中剛才在 User
集合中添加的三條數(shù)據(jù)切記要點(diǎn) REFRESH
建不然軟件不會(huì)自己刷新
這里我使用 GET
請(qǐng)求,路由為/api/user/findOne
因?yàn)檫@里是查 User 集合內(nèi)對(duì)應(yīng)搜索條件的數(shù)據(jù)集合,這里我們用的是name 去查詢的。也可以用唯一值 id 去查詢。
Postman
可以看到返回結(jié)果是一個(gè)集合,了解更多查詢方式可以看下官網(wǎng)
這里我使用 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
打開 MongoDB Compass 查看數(shù)據(jù)
可以看到我們已經(jīng)把小明的年齡與身高做了修改
這里我使用 DELETE
請(qǐng)求,路由為/api/user/:sid
因?yàn)橐拗普?qǐng)求參數(shù)的數(shù)據(jù)類型所以這里方式為 application/json
我們這里傳入數(shù)據(jù)庫中小明的_id 61eea1b4144ea374a5b8455a
傳入 Param
中 ,并發(fā)起請(qǐng)求
Postman
打開 MongoDB Compass 查看數(shù)據(jù)
可以看到小明的信息已經(jīng)不存在了
至此我們已經(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í)。
免責(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)容。