Nest.js Sequelize ORM到数据库(MySQL & PostgreSQL)示例
@TOC
推荐超级课程:
深入研究这个NestJS Sequelize教程,学习如何在NestJS中使用Sequelize创建一个示例数据库连接到PostgreSQL、MySQL和SQLite。
NestJS允许您使用Node.js和TypeScript创建开箱即用的应用程序架构。它与Sequelize模块集成得很好。这样,您可以在代码中创建模型,Sequelize ORM会处理使用SQL数据库(如MySQL和PostgreSQL)的数据库操作。
在本教程中,我将向您展示如何使用Sequelize ORM、MySQL和PostgreSQL构建NestJS。Sequelize作为ORM(对象关系映射)创建简单的代码结构,简化与SQLite、MySQL和PostgreSQL等关系数据库的交互。
您将学到什么
当我带领您深入了解Nest.js和Sequelize ORM如何合作时,您将构建一个RESTful API应用,并学习:
- 如何利用Nest中的Sequelize模块对NestJS实体建模
- 设置使用MySQL和Postgres数据库的Sequelize在NestJS中的最佳方式
- 如何创建使用Sequelize的NestJS强大CRUD RESTful API。
先决条件
在跟随本教程时,请确保您具备以下条件:
- 基本了解Nest.js的工作原理
- 在计算机上安装了Node.js
- 对于数据库,请确保您已准备好MySQL或PostgreSQL。
步骤1:创建您的第一个NestJS Sequelize ORM应用
在项目工作目录中,使用下面的命令创建一个开箱即用的Nest.js应用程序:
npm i -g @nestjs/cli
nest new nest-sequelize
跳转到您创建的新应用程序:
cd nest-sequelize
因为我们正在创建一个CRUD API:
- 您需要一个用于您的API的模块。这将创建forFeature模块,作为Nest.js用于构建API Graph的起点。
- 您需要一个用于监听Sequelize将使用的请求的控制器,并与您的数据库通信以执行CRUD操作。
- 最后,一个提供程序可以在您的数据库中抽象出NestJS Sequelize ORM操作的复杂性和逻辑。
使用以下命令构建您的CRUD NestJS Graph:
nest g module products
nest g service products --no-spec
nest g controller products --no-spec
这将创建一个Product模块。这样,您可以将任何独特模块与其服务、控制器、实体和所有相关内容分组管理起来。
NestJS要求您安装Node.js 上的Sequelize模块 。这是Sequelize需要在Nest.js中舒适工作所需的软件包列表
安装以下Sequelize软件包:
npm i --save @nestjs/sequelize sequelize-typescript sequelize
与此同时,必须安装您选择的数据库的软件包。根据您的选择,可以是MySQL、SQLite或PostgreSQL:
npm i mysql2 pg sqlite
步骤2:使用NestJS与MySQL或PostgreSQL构建Sequelize模型
模型(或实体)是您的Sequelize蓝图。模型允许您定义具有相关属性的模块表。在此步骤中,您将使用代码描述数据库结构,而无需使用SQL查询。
以下是Sequelize如何在NestJS中执行此任务。现在,我们正在创建一个Product应用程序。因此,您需要诸如ID(用于任何关系型数据库)、产品名称、价格等属性。
转到您的src/products
文件夹,并创建一个product.model.ts
文件。您将使用Sequelize及其函数(如Table、Column和Model)创建如下实体:
import { Table, Column, Model } from 'sequelize-typescript';
@Table
export class Product extends Model<Product> {
@Column
name: string;
@Column
description: string;
@Column
price: number;
}
这将指示Sequelize创建一个名为Product
的表。使用@Column
添加每个属性及其数据类型。
您使用sequelize-typescript
基于此示例定义这些属性。同时,您可以使用数据类型,Sequelize将为您建模属性。但是,您需要手动添加Sequelize TypeScript类型检查。
步骤3:使用NestJS与MySQL或PostgreSQL构建Sequelize ORM数据库连接
在Sequelize可以应用您的模型之前,必须建立数据库连接。首先,根据您具体的模块使用SequelizeModule
加载您的模型。在这种情况下,转到src/products/product.module.ts
文件,并确保forFeature
可以获取您的Product
实体,如下所示:
import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
import { Product } from './product.model';
import { ProductsService } from './products.services';
import { ProductsController } from './products.controller';
@Module({
imports: [SequelizeModule.forFeature([Product])],
providers: [ProductsService],
controllers: [ProductsController],
})
export class ProductsModule {}
NestJS现在将使用其主要模块作为构建API的入口点,使用app.module.ts
。在此处,NestJS必须能够在一侧使用Sequelize ORM,而另一侧创建数据库连接并在数据库上建模表。
在app.module.ts
中,确保NestJS主要模块可以执行ProductsModule
和SequelizeModule
,如下所示:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SequelizeModule } from '@nestjs/sequelize';
import { ProductsModule } from './products/products.module';
@Module({
imports: [
SequelizeModule.forRoot({
dialect: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'pass',
database: 'store',
autoLoadModels: true,
synchronize: true,
}),
ProductsModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
注意:
- 这将在PostgreSQL上创建一个数据库连接。
dialect: 'postgres'
明确告诉Sequelize您正在使用的数据库。- 必须添加数据库连接变量如上所示。
- 需要注意的是,Sequelize不会异步创建数据库。因此,请确保您已创建数据库
store
。
如果您使用的是MySQL,只需要更改dialect: 'mysql'
并更改与MySQL相关的连接属性,如下所示:
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'pass',
database: 'store',
autoLoadModels: true,
synchronize: true,
步骤4:使用NestJS提供程序与Sequelize ORM
NestJS使用@Injectable()
类来抽象应用程序的复杂逻辑。这样,您可以创建一个服务、存储库或工厂来管理您希望Sequelize在NestJS中执行的操作。
在此示例中,您有一个ProductsService
。您将使用它来将所有与数据库的通信抽象为带有Sequelize的应用程序。转到您的src/products/products.services.ts
文件,并将您的应用程序中需要的所有CRUD逻辑注入到存储库层,如下所示:
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Product } from './product.model';
@Injectable()
export class ProductsService {
constructor(
@InjectModel(Product)
private readonly productModel: typeof Product,
) {}
async create(productData): Promise<Product> {
const product = new Product(productData);
return await product.save();
}
async findAll(): Promise<Product[]> {
return this.productModel.findAll();
}
async findOne(id: number): Promise<Product> {
return this.productModel.findOne({ where: { id } });
}
async update(id: number, productData): Promise<[number, Product[]]> {
const [affectedCount, affectedRows] = await this.productModel.update(productData, {
where: { id },
returning: true,
});
return [affectedCount, affectedRows as Product[]];
}
async remove(id: number): Promise<number> {
return this.productModel.destroy({ where: { id } });
}
}
步骤5:使用NestJS控制器暴露Sequelize操作
@Controller()
装饰器允许您添加路由作为参数以访问您的API。由于您有上述ProductsService
,因此它将使您能够在处理像GET、POST、DELETE和PUT/PATCH这样的方法时,保持控制器简洁,以处理HTTP请求。
例如:
- 您希望
findAll()
方法处理GET HTTP请求以获取所有产品。 - ‘create’装饰器是您的
ProductsService
,应该允许您的控制器使用POST请求由Sequelize帮助将产品添加到数据库。
在src/products/products.controller.ts
中,按照以下方式处理GET、POST、DELETE、PUT/PATCH HTTP请求:
import { Controller, Get, Post, Put, Delete, Param, Body,Patch } from '@nestjs/common';
import { ProductsService } from './products.services';
import { Product } from './product.model';
@Controller('products')
export class ProductsController {
constructor(private readonly productsService: ProductsService) {}
@Post()
create(@Body() productData): Promise<Product> {
return this.productsService.create(productData);
}
@Get()
findAll(): Promise<Product[]> {
return this.productsService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string): Promise<Product> {
return this.productsService.findOne(Number(id));
}
@Patch(':id')
update(@Param('id') id: string, @Body() productData): Promise<[number, Product[]]> {
return this.productsService.update(Number(id), productData);
}
@Delete(':id')
remove(@Param('id') id: string): Promise<number> {
return this.productsService.remove(Number(id));
}
}
步骤6:运行NestJS Sequelize应用程序
此时,您应该已准备好您的Sequelize NestJS应用程序。请继续运行您的应用程序,如下所示:
npm run start:dev
Sequelize将访问您的数据库并在PostgreSQL或MySQL上执行您的实体,而NestJS通过产品服务和控制器构建应用程序 Graph以创建API路由。
转到您的数据库并确认表及其属性是否已准备就绪。以下是PostgreSQL表的外观:
步骤7:使用Postman测试NestJS CRUD
为了确保该应用程序正常运行,让我们使用相关的HTTP方法执行API端点。转到Postman,并发送POST请求至http://localhost:3000/products
并按照以下方式创建您的第一个Sequelize NestJS Inspired应用程序:
如果您发送GET请求至http://localhost:3000/products
,您应该能够获取POST添加的内容:
您所做的所有更改必须正确记录在您的数据库中。Sequelize和MySQL应该能够处理这一切:
结论
这是一种用更有结构的方式构建您的NestJS服务器端应用程序与Sequelize和关系数据库(如MySQL和PostgreSQL)的教程。希望您找到本教程有用。 最后,您可以在这里 获得全部示例代码!