網(wǎng)站全站開發(fā)需要學(xué)什么bt櫻桃 磁力島
經(jīng)過前面的幾篇文章,想必大家已經(jīng)對(duì)nestjs有了基礎(chǔ)的了解,那么這篇文章就帶大家玩玩數(shù)據(jù)庫,學(xué)會(huì)了這篇,就離大前端又進(jìn)了一步
Nest與數(shù)據(jù)庫無關(guān),使你可以輕松地與任何 SQL 或 NoSQL 數(shù)據(jù)庫集成。 根據(jù)你的喜好,你有多種選擇。 在最一般的層面上,將 Nest 連接到數(shù)據(jù)庫只是為數(shù)據(jù)庫加載適當(dāng)?shù)?Node.js 驅(qū)動(dòng)程序的問題,下面我們就學(xué)習(xí)下如何整合mysql數(shù)據(jù)庫
為了與 SQL 和 NoSQL 數(shù)據(jù)庫集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的對(duì)象關(guān)系映射器 (ORM)。 由于它是用 TypeScript 編寫的,因此可以很好地與 Nest 框架集成。
依賴的安裝
npm install --save @nestjs/typeorm typeorm mysql2
安裝完成后,我們?cè)赼pp.module.ts中引入mysql的配置
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';@Module({imports: [TypeOrmModule.forRoot({type: 'mysql',host: 'localhost',port: 3306,username: 'root', //改成自己賬戶password: 'root', //改成自己密碼database: 'test', //改成自己的數(shù)據(jù)庫entities: [],synchronize: true,}),],
})
export class AppModule {}
創(chuàng)建實(shí)體類
這里的實(shí)體類就是java中的bean對(duì)象,了解java的不陌生,那么我們?nèi)绾卧谶@里定義呢?
user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";@Entity()
export class newUser{@PrimaryGeneratedColumn()id:number@Column("varchar",{length:8})firstName@Column()lastName:string@Column()age:number}
創(chuàng)建user模塊
users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { newUser } from './user.entity';
import { UsersController } from './users.controllers';
import { UsersService } from './users.service';@Module({imports:[TypeOrmModule.forFeature([newUser])], //引入了user實(shí)體providers:[UsersService],controllers:[UsersController]
})
export class UsersModule {}
創(chuàng)建provider服務(wù)
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { newUser } from "./user.entity";
import { DeleteResult, Repository } from "typeorm";@Injectable()
export class UsersService{constructor(@InjectRepository(newUser) private usersRepository:Repository<newUser>){}//待完善的一系列操作數(shù)據(jù)庫的方法
}
創(chuàng)建controller服務(wù)
import { Body, Controller, Delete, Get, Param, Post } from "@nestjs/common";
import { UsersService } from "./users.service";
import { User } from "./interface/users.interface";@Controller("users")
export class UsersController{constructor(private usersService:UsersService){}@Get()getAllUsers(){return this.usersService.findAll()}@Get('/:id')getUserById(@Param('id') id:number){return this.usersService.getUserById(id)}@Delete("/:id")deleteById(@Param('id') id:number){return this.usersService.remove(id)}@Post('')addUserData(@Body() user:User){console.log(user,'add')return this.usersService.addUser(user)}
}
至此創(chuàng)建文件就結(jié)束了,此時(shí)我們可以到數(shù)據(jù)庫看到多了一張表new_user
接下來我們就來進(jìn)行數(shù)據(jù)的crud
增刪改查
業(yè)務(wù)代碼我們要寫在service文件中
查:
findAll():Promise<newUser[]>{return this.usersRepository.find();
}
如果里面沒有任何數(shù)據(jù),那么返回的就是空,這里我已經(jīng)增加了相關(guān)數(shù)據(jù),所以會(huì)有返回結(jié)果
增:
async addUser(user:newUser):Promise<string>{/*** 數(shù)據(jù)庫里面找不到這個(gè)數(shù)據(jù)才新增*/const isNotExist = (await this.usersRepository.find()).every(item => item.firstName != user.firstName && item.lastName != user.lastName)if(isNotExist){await this.usersRepository.save(user)console.log("🚀 ~ file: users.service.ts:28 ~ UsersService ~ addUser ~ data:",'ok')return "ok"}else{return "不允許重復(fù)添加數(shù)據(jù)"}}
這里是post請(qǐng)求,我們需要借助postman等來進(jìn)行操作
非常好,我們成功新增了一條數(shù)據(jù)…
那如果我們?cè)黾右粭l已經(jīng)存在的數(shù)據(jù),那結(jié)果會(huì)怎樣呢?我們可以試試,因?yàn)槲疫@里是不允許重名的,所以無法新增成功,重名會(huì)報(bào)錯(cuò),大家可以根據(jù)自己的實(shí)際業(yè)務(wù)需求進(jìn)行操作
再次添加白眉鷹王,返回提示重復(fù),數(shù)據(jù)庫也沒變化
刪:
async remove(id:number):Promise<number>{const data = await this.usersRepository.delete(id)console.log(data,'delete-data')return data.affected;
}
根據(jù)id刪了id為6的白眉,再次查詢,數(shù)據(jù)庫就少了這條數(shù)據(jù),刪除成功!!!
完整的代碼如下
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { newUser } from "./user.entity";
import { DeleteResult, Repository } from "typeorm";@Injectable()
export class UsersService{constructor(@InjectRepository(newUser) private usersRepository:Repository<newUser>){}findAll():Promise<newUser[]>{return this.usersRepository.find();}getUserById(id:number):Promise<newUser | null>{return this.usersRepository.findOneBy({id})}async remove(id:number):Promise<number>{const data = await this.usersRepository.delete(id)console.log(data,'delete-data')return data.affected;}async addUser(user:newUser):Promise<string>{/*** 數(shù)據(jù)庫里面找不到這個(gè)數(shù)據(jù)才新增*/const isNotExist = (await this.usersRepository.find()).every(item => item.firstName != user.firstName && item.lastName != user.lastName)if(isNotExist){await this.usersRepository.save(user)console.log("🚀 ~ file: users.service.ts:28 ~ UsersService ~ addUser ~ data:",'ok')return "ok"}else{return "不允許重復(fù)添加數(shù)據(jù)"}}
}
這樣我們就實(shí)現(xiàn)了,nestjs整合mysql數(shù)據(jù)庫,實(shí)現(xiàn)數(shù)據(jù)crud了,以后再也不用讓求著讓后端幫忙改接口了…
更多后續(xù)精彩內(nèi)容,請(qǐng)關(guān)注本系列的動(dòng)態(tài)