在NestJS中集成和使用資料庫
- 832字
- 4分鐘
- 2024-07-11
本文將詳細介紹如何在 NestJS 專案中集成和使用關係資料庫和非關係資料庫,包括資料庫配置、模型設計和複雜查詢的實現。
集成關係資料庫
配置 TypeORM
TypeORM 是一個功能強大的 ORM 工具,支援多種關係資料庫。我們將以 MySQL 為例,介紹如何配置 TypeORM。
- 安裝必要的包:
1npm install --save @nestjs/typeorm typeorm mysql2
- 在
app.module.ts
中配置 TypeORM:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [7 TypeOrmModule.forRoot({8 type: "mysql",9 host: "localhost",10 port: 3306,11 username: "root",12 password: "password",13 database: "test",14 entities: [__dirname + "/**/*.entity{.ts,.js}"],15 synchronize: true,16 }),17 UsersModule,18 ],19})20export class AppModule {}
設計資料庫模型
創建一個 User
實體,定義用戶的資料庫模型:
1import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";2
3@Entity()4export class User {5 @PrimaryGeneratedColumn()6 id: number;7
8 @Column()9 name: string;10
11 @Column()12 email: string;13
14 @Column()15 password: string;16}
進行資料庫操作
在 users.service.ts
中實現 CRUD 操作:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 findAll(): Promise<User[]> {14 return this.usersRepository.find();15 }16
17 findOne(id: number): Promise<User> {18 return this.usersRepository.findOne(id);19 }20
21 create(user: User): Promise<User> {22 return this.usersRepository.save(user);23 }24
25 async update(id: number, user: Partial<User>): Promise<void> {26 await this.usersRepository.update(id, user);27 }28
29 async remove(id: number): Promise<void> {30 await this.usersRepository.delete(id);31 }32}
實現複雜查詢
在 users.service.ts
中實現複雜查詢:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 // 複雜查詢示例:查找包含特定關鍵詞的用戶14 async findUsersByKeyword(keyword: string): Promise<User[]> {15 return this.usersRepository16 .createQueryBuilder("user")17 .where("user.name LIKE :keyword OR user.email LIKE :keyword", {18 keyword: `%${keyword}%`,19 })20 .getMany();21 }22}
集成非關係資料庫
配置 Mongoose
Mongoose 是一個流行的 ODM 工具,適用於 MongoDB。我們將介紹如何配置 Mongoose。
- 安裝必要的包:
1npm install --save @nestjs/mongoose mongoose
- 在
app.module.ts
中配置 Mongoose:
1import { Module } from "@nestjs/common";2import { MongooseModule } from "@nestjs/mongoose";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [MongooseModule.forRoot("mongodb://localhost/nest"), UsersModule],7})8export class AppModule {}
設計資料庫模型
創建一個 User
模型,定義用戶的資料庫模型:
1import { Schema } from "mongoose";2
3export const UserSchema = new Schema({4 name: String,5 email: String,6 password: String,7});
進行資料庫操作
在 users.service.ts
中實現 CRUD 操作:
1import { Injectable } from "@nestjs/common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5import { CreateUserDto } from "./create-user.dto";6
7@Injectable()8export class UsersService {9 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}10
11 async findAll(): Promise<User[]> {12 return this.userModel.find().exec();13 }14
15 async findOne(id: string): Promise<User> {16 return this.userModel.findById(id).exec();17 }18
19 async create(createUserDto: CreateUserDto): Promise<User> {20 const createdUser = new this.userModel(createUserDto);21 return createdUser.save();22 }23
24 async update(id: string, user: Partial<User>): Promise<User> {25 return this.userModel.findByIdAndUpdate(id, user, { new: true }).exec();26 }27
28 async remove(id: string): Promise<User> {29 return this.userModel.findByIdAndRemove(id).exec();30 }31}
實現複雜查詢
在 users.service.ts
中實現複雜查詢:
1import { Injectable } from "@nestjs.common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5
6@Injectable()7export class UsersService {8 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}9
10 // 複雜查詢示例:查找包含特定關鍵詞的用戶11 async findUsersByKeyword(keyword: string): Promise<User[]> {12 return this.userModel13 .find({14 $or: [15 { name: new RegExp(keyword, "i") },16 { email: new RegExp(keyword, "i") },17 ],18 })19 .exec();20 }21}
總結
本文詳細介紹了如何在 NestJS 中集成和使用關係資料庫和非關係資料庫。我們通過具體的配置和代碼示例展示了如何使用 TypeORM 和 Mongoose 進行資料庫操作、設計資料庫模型以及實現複雜查詢。在實際開發中,選擇合適的資料庫和 ORM/ODM 工具對於構建高效、可擴展的應用至關重要。