在NestJS中集成和使用数据库

本文将详细介绍如何在 NestJS 项目中集成和使用关系数据库和非关系数据库,包括数据库配置、模型设计和复杂查询的实现。

集成关系数据库

配置 TypeORM

TypeORM 是一个功能强大的 ORM 工具,支持多种关系数据库。我们将以 MySQL 为例,介绍如何配置 TypeORM。

  1. 安装必要的包:
Terminal window
1
npm install --save @nestjs/typeorm typeorm mysql2
  1. app.module.ts 中配置 TypeORM:
1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { 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
})
20
export class AppModule {}

设计数据库模型

创建一个 User 实体,定义用户的数据库模型:

1
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
2
3
@Entity()
4
export 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 操作:

1
import { Injectable } from "@nestjs/common";
2
import { InjectRepository } from "@nestjs/typeorm";
3
import { Repository } from "typeorm";
4
import { User } from "./user.entity";
5
6
@Injectable()
7
export 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 中实现复杂查询:

1
import { Injectable } from "@nestjs/common";
2
import { InjectRepository } from "@nestjs/typeorm";
3
import { Repository } from "typeorm";
4
import { User } from "./user.entity";
5
6
@Injectable()
7
export 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.usersRepository
16
.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。

  1. 安装必要的包:
Terminal window
1
npm install --save @nestjs/mongoose mongoose
  1. app.module.ts 中配置 Mongoose:
1
import { Module } from "@nestjs/common";
2
import { MongooseModule } from "@nestjs/mongoose";
3
import { UsersModule } from "./users/users.module";
4
5
@Module({
6
imports: [MongooseModule.forRoot("mongodb://localhost/nest"), UsersModule],
7
})
8
export class AppModule {}

设计数据库模型

创建一个 User 模型,定义用户的数据库模型:

1
import { Schema } from "mongoose";
2
3
export const UserSchema = new Schema({
4
name: String,
5
email: String,
6
password: String,
7
});

进行数据库操作

users.service.ts 中实现 CRUD 操作:

1
import { Injectable } from "@nestjs/common";
2
import { InjectModel } from "@nestjs/mongoose";
3
import { Model } from "mongoose";
4
import { User } from "./user.interface";
5
import { CreateUserDto } from "./create-user.dto";
6
7
@Injectable()
8
export 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 中实现复杂查询:

1
import { Injectable } from "@nestjs/common";
2
import { InjectModel } from "@nestjs/mongoose";
3
import { Model } from "mongoose";
4
import { User } from "./user.interface";
5
6
@Injectable()
7
export class UsersService {
8
constructor(@InjectModel("User") private readonly userModel: Model<User>) {}
9
10
// 复杂查询示例:查找包含特定关键词的用户
11
async findUsersByKeyword(keyword: string): Promise<User[]> {
12
return this.userModel
13
.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 工具对于构建高效、可扩展的应用至关重要。

美团外卖红包 饿了么红包 支付宝红包