「埃尔法哥哥」nestjs使用Typeorm实现数据库CRUD操作


本示例在nestjs脚手架项目基础上 , 进行了一些修改 , 并通过TypeOrm实现了数据库的增删读写操作 。 由于Typeorm更适合关系型数据库 , 本示例为简便起见 , 选择sqlite3作为试验数据库 。 对于非关系型数据库如mongodb , 则推荐使用mongoose或者typegoose等库进行数据库操作 。
1.nestjs安装和快速启动
「埃尔法哥哥」nestjs使用Typeorm实现数据库CRUD操作
本文插图
安装nestjs命令行工具
#安装cli工具
$ npm i-g @nestjs/cli
#新建项目
$ nest new projectName
#如果用yarn安装的话
$ yarn global add @nestjs/cli
2.模版项目helloworld说明
不同版本的cli命令行生成的默认项目可能有所不同 。 这里将默认的helloworld修改为async异步形式来对nestjs方法进行说明 。
2.1 app.controller.ts文件
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
/**
* 应用程序控制器 , @Controller() 可以指定参数 , 用于定义类的父路由 , 如 @Controller("cat") , 此时这个类的所有父路由就会成为 /cat
*
* 被 @Controller() 修饰的类 , 可以通过其构造函数完成依赖注入 , 但依赖注入的类必须与当前类属于同一个模块
*/
@Controller()
export class AppController {
/**
* 构造函数 , 用于注入这个类的依赖 , 注入类时 , 需要使用 @Inject() 修饰符 , 其参数是被注入的类的类名
* 在注入被 @Injectable() 修饰的类时 , 可以不使用 @Inject() 修饰参数 , 此时依赖注器入会使用参数的类型完成注入
*
* Tips: 这里使用 @Inject(AppService) 是为了规范代码风格
*/
constructor(
@Inject(AppService) private readonly appService: AppService,
) { }
/**
* @Get() 可以指定参数 , 用于定义方法路由 , 如 @Get(":id") , 此时这个方法路由就会成为 /:id , 即查询指定ID
*/
@Get()
async root() {
return this.appService.root();
}
}
2.2 app.service.ts文件
「埃尔法哥哥」nestjs使用Typeorm实现数据库CRUD操作
本文插图
import { Injectable } from '@nestjs/common';
/**
* 被 @Injectable() 修饰的类 , 可以通过其构造函数完成依赖注入 , 但依赖注入的类必须与当前类属于同一个模块
*/
@Injectable()
export class AppService {
constructor() { } // 构造函数 , 一般用于处理依赖注入
async root() {
return 'Hello World!';
}
}
2.3 app.module.ts文件
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CatModule } from 'cats/cat.module';
import { ErrorsInterceptor } from 'common/errors.interceptor';
import { AppController } from './app.controller';
import { AppService } from './app.service';
/**
* @Module() 定义一个模块 , 并管理这个模块的导入集合、控制器集合、提供者集合、导出集合
*/
@Module({
// TypeOrmModule.forRoot() 默认加载项目根目录下的 ormconfig.json 配置文件用于配置数据库连接
// TypeORM 配置文件详细文档 https://typeorm.io/#/using-ormconfig
imports: [TypeOrmModule.forRoot(), CatModule], // 导入其他模块的集合