NestJS 3 分鐘搭好 MySQL + MongoDB,CRUD 復制粘貼直接運行

基于上一篇內容《為什么現代 Node 后端都選 NestJS + TypeScript?這組合真香了》,這篇文章繼續寫數據庫的連接。

所以今天把MySQL、MongoDB全接上,做個小實例。朋友們項目里用什么數據庫可以視情況而定。
這里的功能分別為:

  • MySQL:存用戶
  • MongoDB:存日志

代碼短、跟著敲就行。

1. 生成對應架構

執行以下命令生成相關模塊代碼(Module/Service/Controller)

nest g res user
nest g res log

2. 裝包

pnpm i @nestjs/typeorm typeorm mysql2
pnpm i @nestjs/mongoose mongoose

3. 連庫

app.module.ts 一次配好

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MongooseModule } from '@nestjs/mongoose';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TodoModule } from './todo/todo.module';
import { UserModule } from './user/user.module';
import { LogModule } from './log/log.module';@Module({imports: [// MySQLTypeOrmModule.forRoot({type: 'mysql',host: 'localhost',port: 3306,username: 'root',password: 'SV^u8@rB8',database: 'demo',autoLoadEntities: true,synchronize: true, // 僅本地用,生產關掉}),// MongoDBMongooseModule.forRoot('mongodb://localhost:27017/test'),// 業務模塊TodoModule,UserModule,LogModule,],controllers: [AppController],providers: [AppService],
})
export class AppModule {}

代碼生成了,接下來我們來處理數據庫和增刪改查的代碼。

Mysql

1. 實體和數據表

數據庫表
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用戶名',`age` int DEFAULT NULL COMMENT '年齡',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用戶表';
MySQL 實體
// user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()
export class User {@PrimaryGeneratedColumn() id: number;@Column() name: string;@Column() age: number;
}
Dto
// create-user.dto.ts
export class CreateUserDto {name: string;age: number;
}

這里容易出現一個Eslint問題的爆紅,如下圖:

出現這種情況執行以下命令:

npx eslint "src/**/*.{ts,js}" --fix --ext .ts,.js

如果還是不行,再執行下這個

npx prettier --write "src/**/*.{ts,js,json}"

2. 業務代碼(cv即可)

user.controller.ts
import { Controller, Get, Post, Body, Patch, Param, Delete,} from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';@Controller('user')
export class UserController {constructor(private readonly userService: UserService) {}@Post()create(@Body() createUserDto: CreateUserDto) {return this.userService.create(createUserDto);}@Get()findAll() {return this.userService.findAll();}@Get(':id')findOne(@Param('id') id: string) {return this.userService.findOne(+id);}@Patch(':id')update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {return this.userService.update(+id, updateUserDto);}@Delete(':id')remove(@Param('id') id: string) {return this.userService.remove(+id);}
}
user.module.ts

這里稍微的修改了一下,引入了TypeOrmModule

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from './entities/user.entity';@Module({imports: [TypeOrmModule.forFeature([User])],controllers: [UserController],providers: [UserService],
})
export class UserModule {}
user.service.ts

完成了增刪改查的業務代碼

import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';@Injectable()
export class UserService {constructor(@InjectRepository(User)private readonly repo: Repository<User>,) {}async create(createUserDto: CreateUserDto): Promise<User> {return await this.repo.save(createUserDto);}async findAll(): Promise<User[]> {return await this.repo.find();}async findOne(id: number): Promise<User> {const user = await this.repo.findOne({ where: { id } });if (!user) {throw new Error(`User with ID ${id} not found`);}return user;}async update(id: number, updateUserDto: UpdateUserDto): Promise<User> {const user = await this.findOne(id);Object.assign(user, updateUserDto);return await this.repo.save(user);}async remove(id: number): Promise<void> {const user = await this.findOne(id);await this.repo.remove(user);}
}

3. 跑起來,測試下接口

npm run start

新增

POST http://localhost:3000/user

{ "name": "張三", "age": 30 }

修改

POST http://localhost:3000/user

{ "id": 1, "name": "張三", "age": 31 }

刪除

DELETE http://localhost:3000/user/1

查詢

GET http://localhost:3000/user/1

這里實現mysql的增刪改查就完成了

MongoDB

大致流程和mysql是一樣的,寫法稍微有些差別

1. 實體和集合

創建一個集合
db.createCollection("logs");
集合 實體
// log.entity.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';export type LogDocument = Log & Document;@Schema()
export class Log {_id?: Types.ObjectId;@Prop({ required: true })message: string;@Prop({ default: Date.now })timestamp: Date;
}export const LogSchema = SchemaFactory.createForClass(Log);
Dto
// create-log.dto.ts
export class CreateLogDto {message: string;timestamp?: Date;
}

2. 業務代碼(cv即可)

log.controller.ts
import {Controller, Get, Post, Body, Patch, Param, Delete} from '@nestjs/common';
import { LogService } from './log.service';
import { CreateLogDto } from './dto/create-log.dto';
import { UpdateLogDto } from './dto/update-log.dto';@Controller('log')
export class LogController {constructor(private readonly logService: LogService) {}@Post()create(@Body() createLogDto: CreateLogDto) {return this.logService.create(createLogDto);}@Get()findAll() {return this.logService.findAll();}@Get(':id')findOne(@Param('id') id: string) {return this.logService.findOne(id);}@Patch(':id')update(@Param('id') id: string, @Body() updateLogDto: UpdateLogDto) {return this.logService.update(id, updateLogDto);}@Delete(':id')remove(@Param('id') id: string) {return this.logService.remove(id);}
}
log.module.ts

引入了MongooseModule

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { LogService } from './log.service';
import { LogController } from './log.controller';
import { Log, LogSchema } from './entities/log.entity';@Module({imports: [MongooseModule.forFeature([{ name: Log.name, schema: LogSchema }])],controllers: [LogController],providers: [LogService],
})
export class LogModule {}
user.service.ts

增刪改查的業務代碼

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { CreateLogDto } from './dto/create-log.dto';
import { UpdateLogDto } from './dto/update-log.dto';
import { Log, LogDocument } from './entities/log.entity';@Injectable()
export class LogService {constructor(@InjectModel(Log.name) private logModel: Model<LogDocument>) {}async create(createLogDto: CreateLogDto): Promise<Log> {const createdLog = new this.logModel(createLogDto);return createdLog.save();}async findAll(): Promise<Log[]> {return this.logModel.find().exec();}async findOne(id: string): Promise<Log> {const log = await this.logModel.findById(id).exec();if (!log) {throw new Error(`Log with ID ${id} not found`);}return log;}async update(id: string, updateLogDto: UpdateLogDto): Promise<Log> {const updatedLog = await this.logModel.findByIdAndUpdate(id, updateLogDto, { new: true }).exec();if (!updatedLog) {throw new Error(`Log with ID ${id} not found`);}return updatedLog;}async remove(id: string): Promise<void> {const result = await this.logModel.findByIdAndDelete(id).exec();if (!result) {throw new Error(`Log with ID ${id} not found`);}}
}

3. 啟動,測試接口

npm run start

新增

POST http://localhost:3000/log

{ "message": "張三的消息" }

修改

POST http://localhost:3000/log

{ "id": 1, "message": "李四的消息"}

刪除

DELETE http://localhost:3000/log/1

查詢

GET http://localhost:3000/log/1

MongoDB的增刪改查完成

小結

  • MySQL:使用TypeORM實體一把梭
  • MongoDB:使用Schema裝飾器直接上

NestJS真的是結構清晰,開發很快,再也不用從頭造輪子了。

我是大華,專注分享前后端開發的實戰筆記。關注我,少走彎路,一起進步!

📌往期精彩

《Elasticsearch 太重?來看看這個輕量級的替代品 Manticore Search》

《別再if套if了!Java中return的9種優雅寫法》

《別學23種了!Java項目中最常用的6個設計模式,附案例》

《寫給小公司前端的 UI 規范:別讓頁面丑得自己都看不下去》

《Vue3+TS設計模式:5個真實場景讓你代碼更優雅》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95552.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用了企業微信 AI 半年,這 5 個功能讓我徹底告別重復勞動

每天上班不是在整理會議紀要&#xff0c;就是在翻聊天記錄找文件&#xff0c;寫文檔還要自己摳數據…… 這些重復勞動是不是也在消耗你的時間&#xff1f;作為用了企業微信 AI 功能半年的 “老用戶”&#xff0c;我必須說&#xff1a;企業微信 AI 的這 5 個功能&#xff0c;真的…

從入門到高手,Linux就應該這樣學【好書推薦】

從入門到高手&#xff0c;請這樣學Linux 一、Linux基礎與終端操作 1.1 Linux簡介 Linux 是一種開源的類 Unix 操作系統&#xff0c;以其穩定性、安全性和高效性被廣泛應用于服務器、嵌入式系統及開發環境中。掌握基本命令和操作技巧是 Linux 學習的關鍵。 1.2 終端基礎 打開…

【數據可視化-104】安徽省2025年上半年GDP數據可視化分析:用Python和Pyecharts打造炫酷大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

組件庫UI自動化

一、背景 背景&#xff1a; 組件庫全局改動場景多&#xff0c;組件之間耦合場景多–時常需要全場景回歸組件庫demo有200多個&#xff0c;手動全局回歸耗時耗力細微偏差純視覺無法辨別 可行性分析&#xff1a; 組件庫功能占比 L1&#xff08;視覺層&#xff09;&#xff1a;圖片…

面試題:JVM與G1要點總結

一.Java內存區域 1.運行時數據區的介紹 2.站在線程的角度看Java內存區域 3.深入分析堆和棧的區別 4.方法的出入棧和棧上分配、逃逸分析及TLAB 5.虛擬機中的對象創建步驟 6.對象的內存布局 1.運行時數據區的介紹 運行時數據區的類型&#xff1a;程序計數器、Java虛擬機棧、本地方…

車輛安全供電系統開發原則和實踐

摘要在汽車行業中&#xff0c;安全應用的重要性在不斷提升&#xff0c;例如受車輛自動化發展以及機械備用系統重要性降低的影響。為應對這些趨勢&#xff0c;安全相關的電氣和 / 或電子系統&#xff08;E/E 系統&#xff09;的電源輸入必須由供電系統來保障&#xff0c;這使得功…

WebSocket客戶端庫:websocket-fruge365

&#x1f680; 從零開始打造一個WebSocket客戶端庫&#xff1a;websocket-fruge365 &#x1f4d6; 前言 在現代Web開發中&#xff0c;實時通信已經成為不可或缺的功能。無論是聊天應用、實時數據監控&#xff0c;還是在線協作工具&#xff0c;WebSocket都扮演著重要角色。然而…

rocketmq批量執行跑批任務報錯

rocketmq批量執行跑批任務&#xff0c;報下面的錯誤&#xff0c;怎么處理一下呢&#xff1f;是修改配置還是修改代碼還是&#xff1f; org.apache.rocketmq.client.exception.MQBrokerException: CODE: 215 DESC: [FLOW]client has exhausted the send quota for the current …

大語言模型(LLM)簡介與應用分享

1. 什么是大語言模型&#xff08;LLM&#xff09; 大語言模型&#xff08;Large Language Model&#xff0c;簡稱 LLM&#xff09;是基于 深度學習 和 海量文本數據 訓練而成的人工智能模型。 采用 Transformer 架構參數規模巨大&#xff08;數十億到數千億&#xff09;能夠 理…

【算法筆記】選擇排序、插入排序、冒泡排序、二分查找問題

算法的筆記&#xff0c;直接上代碼&#xff0c;思路和問題這些&#xff0c;都在代碼注釋上面 1、工具類 為了生成測試代碼和比較器&#xff0c;專門寫了一個數組工具類&#xff0c;代碼如下&#xff1a; /*** 數組工具類*/ public class ArrUtil {/*** 生成隨機數組* 長度是[0,…

行業分享丨基于SimSolid的大型汽車連續沖壓模具剛度分析

*本文投稿自機械零部件制造業用戶 汽車連續模具的剛度直接決定了沖壓件質量&#xff08;尺寸精度、表面缺陷&#xff09;與模具壽命。傳統有限元分析&#xff08;FEA&#xff09;在面對大型復雜模具裝配體時&#xff0c;存在網格劃分困難、計算資源消耗大、周期長等瓶頸。本文以…

用AI生成的html頁面設計放到到Axure上實現再改造的方法

要將 AI 生成的 HTML 原型導入 Axure&#xff0c;該方法的核心邏輯是以 Figma 為 “中間橋梁”&#xff08;因 Axure 無法直接讀取 HTML&#xff0c;需通過 Figma 轉換格式&#xff09;&#xff0c;分 3 步即可完成&#xff0c;以下是詳細操作指南&#xff08;含每步目標、具體…

從入門到實戰:Linux sed命令全攻略,文本處理效率翻倍

從入門到實戰&#xff1a;Linux sed命令全攻略&#xff0c;文本處理效率翻倍 文章目錄從入門到實戰&#xff1a;Linux sed命令全攻略&#xff0c;文本處理效率翻倍一、認識sed&#xff1a;什么是流編輯器&#xff1f;二、吃透sed工作原理&#xff1a;為什么它能高效處理文本&am…

TIOBE 8月編程語言榜深度解析:Python占比突破26%,Perl成最大黑馬

根據TIOBE最新發布的2025年8月編程語言排行榜&#xff0c;一場靜默的技術變革正在上演&#xff1a;Python以26.14%的占比首次突破26%大關&#xff0c;連續12個月穩居榜首。這一數據不僅刷新了Python自身的歷史紀錄&#xff0c;更成為TIOBE指數自2001年創立以來的最高單語言占比…

從發現到恢復,看瑞數信息如何構建“抗毀重構”實戰路徑

在信息化社會&#xff0c;“韌性”“彈性”這些詞匯常被用來形容系統抵御和應對風險的能力&#xff0c;但對于身處關鍵基礎設施行業的運營者來說&#xff0c;這些概念往往過于抽象&#xff0c;難以直接指導實踐。 相比之下&#xff0c;“抗毀重構”更具畫面感。它不僅是一個管理…

深入理解 jemalloc:從內存分配機制到技術選型

在高性能服務&#xff08;如數據庫、緩存、JVM&#xff09;的底層優化中&#xff0c;內存分配效率直接影響系統整體性能。本文將從操作系統底層的malloc機制切入&#xff0c;詳解 jemalloc 的設計理念、開源應用場景、實戰案例&#xff0c;技術選型分析 一、操作系統底層的內存…

websoket使用記錄

1.項目使用記錄1.醫療項目中渲染回收柜溫濕度&#xff0c;需要實時更新2.回收柜安瓿回收和余液回收時&#xff0c;需要前端發送指令給回收柜&#xff0c;比如開門、關門等。還需要收到回收柜結果&#xff0c;比如回收的藥品信息等。我項目中用的是瀏覽器自帶的websoket&#xf…

DevOps篇之通過GitLab CI 流水線實現k8s集群中helm應用發布

一. 設計思路 構建一個 GitLab CI 流水線&#xff0c;并且要集成到 K8s 集群中的 Helm 應用發布流程。首先&#xff0c;需要了解 GitLab CI 的基本結構&#xff0c;比如.gitlab-ci.yml 文件的配置&#xff0c;包括 stages、jobs、變量設置等。然后&#xff0c;結合之前討論的 H…

詳盡 | Deeplabv3+結構理解

https://arxiv.org/pdf/1802.02611.pdf https://link.springer.com/chapter/10.1007/978-3-319-10578-9_23 目錄 Deeplabv3 Encoder部分 Decoder部分 補充摘要 SPP 空間金字塔池化層模塊 Dilated/Atrous Conv 空洞卷積 Deeplabv3 deeplab-v3是語義分割網絡&#xff0c;組…

【51單片機】【protues仿真】基于51單片機音樂盒(8首歌曲)系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、數碼管顯示當前歌曲序號 2、按鍵切換歌曲和播放暫停? 3、內置8首音樂 二、使用步驟 基于51單片機的音樂盒是一種能夠存儲和播放多首歌曲的電子設備&#xff0c;通過定時器產…