返回

TypeORM + Nest.js:数据库操作的利器

前端

TypeORM + Nest.js:数据库操作指南

简介

在构建后端应用程序时,数据库操作是至关重要的。本文将探讨如何使用 TypeORM 和 Nest.js 进行数据库操作,这两个流行的框架可以简化和增强此过程。

TypeORM

TypeORM 是一个对象关系映射(ORM)工具,它允许您将 JavaScript 对象映射到数据库表。它提供了一系列特性,例如实体定义、查询构建器和自动同步。

Nest.js

Nest.js 是一个基于 TypeScript 的后端框架,它采用模块化、依赖注入和路由等原则。它提供了对 TypeORM 的原生支持,使数据库集成变得更加容易。

入门

首先,在您的 Nest.js 项目中安装 TypeORM:

npm install typeorm

然后,创建一个数据库连接:

// ormconfig.json
{
  "type": "postgres",
  "host": "localhost",
  "port": 5432,
  "username": "postgres",
  "password": "postgres",
  "database": "my-database",
  "entities": ["src/entities/*.ts"],
  "synchronize": true
}

此配置指定了数据库类型、凭据和实体的位置。

创建实体

实体是表示数据库表中数据行的 JavaScript 对象。创建实体:

// src/entities/user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

  @Column()
  name: string;

  @Column()
  email: string;
}

此实体定义了包含三个字段(ID、姓名和电子邮件)的用户表。

创建服务

服务处理业务逻辑。创建 UserService 来处理用户相关操作:

// src/services/user.service.ts
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { User } from "../entities/user.entity";

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

  // ...
}

此服务注入了一个存储库,该存储库提供对用户实体的访问。

创建控制器

控制器处理 HTTP 请求。创建 UserController 来公开用户相关端点:

// src/controllers/user.controller.ts
import { Controller, Get, Post, Put, Delete, Param, Body } from "@nestjs/common";
import { UserService } from "../services/user.service";
import { User } from "../entities/user.entity";

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

  // ...
}

此控制器定义了查找、创建、更新和删除用户的端点。

代码示例

让我们看看如何使用上述代码在控制器中查找用户:

@Get(":id")
async findOne(@Param("id") id: number): Promise<User> {
  return await this.userService.findOne(id);
}

此端点将返回具有给定 ID 的用户。

优点

  • 简化数据库操作: TypeORM 提供了一个直观的 API,使与数据库的交互变得更加容易。
  • 自动同步: TypeORM 可自动将实体与数据库表同步,从而减少手动维护的需要。
  • 对象关系映射: TypeORM 允许您轻松地在 JavaScript 对象和数据库表之间进行转换。
  • 依赖注入: Nest.js 的依赖注入使您可以轻松地将服务和存储库注入到控制器中。
  • 模块化: Nest.js 的模块化架构使您能够将应用程序组织成可管理的模块。

常见问题

  1. 我可以在 TypeORM 中使用哪些数据库类型?
    TypeORM 支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Oracle 等各种数据库。
  2. 我可以自定义实体字段的名称吗?
    是的,您可以使用 @Column({ name: "custom_name" }) 装饰器来指定自定义字段名称。
  3. 如何处理多对多关系?
    TypeORM 提供了 @ManyToMany 装饰器来处理多对多关系。
  4. Nest.js 中的存储库和服务有什么区别?
    存储库提供对数据库实体的直接访问,而服务处理业务逻辑并封装存储库操作。
  5. 如何进行高级查询?
    TypeORM 提供了一个查询构建器,允许您构建复杂的查询。

结论

TypeORM 和 Nest.js 是进行数据库操作的强大组合。它们简化了开发过程,提供了强大的特性,并遵循最佳实践。通过本文中的指南,您可以自信地使用它们来构建健壮的后端应用程序。