返回

新手指南:从零开始用 Nest 搞定 MySQL 数据库

前端

在 Nest 框架中建立 MySQL 连接:打造无缝的数据管理系统

在现代 Web 开发中,数据管理是至关重要的。通过与数据库无缝交互,应用程序可以存储、检索和操作用户数据。Nest 框架 作为一款现代、高效的 Node.js 框架,简化了与 MySQL 数据库的连接过程。

一、准备工作

要使用 MySQL 数据库,你需要:

  • 安装 Node.js v14 或更高版本。
  • 安装 Nest CLI:npm install -g @nestjs/cli
  • 创建一个新的 Nest 项目:nest new my-nest-project

二、引入 MySQL 依赖

安装 MySQL 驱动:npm install mysql2

三、配置数据库连接

src/database/database.module.ts 中添加以下代码:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: () => ({
        type: 'mysql',
        host: process.env.DB_HOST,
        port: parseInt(process.env.DB_PORT),
        username: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        entities: [],
        synchronize: true,
      }),
    }),
  ],
})
export class DatabaseModule {}

四、创建实体

实体代表数据库中的表。在 src/entities 中创建一个文件(如 user.entity.ts)并定义一个实体类:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

五、添加仓库

仓库提供对数据库的访问。在 src/repositories 中创建一个文件(如 user.repository.ts)并定义一个仓库类:

import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';

@Injectable()
export class UserRepository {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  async findAll(): Promise<User[]> {
    return await this.userRepository.find();
  }

  // 其他 CRUD 方法...
}

六、创建控制器

控制器处理来自客户端的请求。在 src/controllers 中创建一个文件(如 user.controller.ts)并定义一个控制器类:

import { Controller, Get, Post, Put, Delete, Body, Param } from '@nestjs/common';
import { UserService } from '../services/user.service';

@Controller('users')
export class UserController {
  constructor(private userService: UserService) {}

  async findAll(): Promise<User[]> {
    return await this.userService.findAll();
  }

  // 其他 CRUD 方法...
}

七、创建服务

服务充当控制器和仓库之间的桥梁。在 src/services 中创建一个文件(如 user.service.ts)并定义一个服务类:

import { Injectable } from '@nestjs/common';
import { UserRepository } from '../repositories/user.repository';

@Injectable()
export class UserService {
  constructor(private userRepository: UserRepository) {}

  async findAll(): Promise<User[]> {
    return await this.userRepository.findAll();
  }

  // 其他 CRUD 方法...
}

八、运行项目

启动项目:npm start

九、测试项目

通过以下方式测试项目:

  • 访问 http://localhost:3000/users 获取用户列表。
  • 访问 http://localhost:3000/users/1 获取特定用户。
  • 使用 POST 请求创建用户。
  • 使用 PUT 请求更新用户。
  • 使用 DELETE 请求删除用户。

常见问题解答

Q1:为什么我连接不到数据库?
A1:确保数据库配置信息正确,并且 MySQL 正在运行。

Q2:我无法找到一个实体或仓库类?
A2:确保已正确创建并导入相关文件。

Q3:我无法通过控制器访问服务?
A3:确保已正确注入服务并在控制器中使用它。

Q4:如何使用事务处理数据库操作?
A4:使用 TypeORM 的 TransactionManager 或 TransactionRepository。

Q5:我如何防止 SQL 注入攻击?
A5:使用 TypeORM 的 escape 或 sanitize 方法,并避免拼接查询字符串。

结论

通过将 Nest 框架与 MySQL 数据库连接起来,你可以轻松地管理用户数据,构建健壮、可扩展的 Web 应用程序。遵循本指南中的步骤,即可快速轻松地实现数据库集成。保持联系,了解更多关于 Nest 框架和 MySQL 的技巧和窍门,提升你的 Web 开发技能!