[Nest] 05.nest之數據庫


數據庫

Nest 與數據庫無關,允許您輕松地與任何 SQL 或 NoSQL 數據庫集成.根據您的偏好,您有許多可用的選項.一般來說,將 Nest 連接到數據庫只需為數據庫加載一個適當的 Node.js 驅動程序,就像使用 Express 或 Fastify 一樣.

您還可以直接使用任何通用的 Node.js 數據庫集成庫或 ORM ,以在更高的抽象級別上進行操作.

  • Sequelize (recipe)
  • knexjs (tutorial
  • TypeORM

Nest 還提供了與現成的 TypeORM 與 @nestjs/typeorm 的緊密集成.這些集成提供了附加的特定於 nestjs 的特性,比如模型/存儲庫注入、可測試性和異步配置,從而使訪問您選擇的數據庫更加容易

TypeORM 集成

為了與 SQL 和 NoSQL 數據庫集成,Nest 提供了 @nestjs/typeorm 包.Nest 使用 TypeORM 是因為它是 TypeScript 中最成熟的對象關系映射器( ORM ).因為它是用 TypeScript 編寫的,所以可以很好地與 Nest 框架集成.

為了開始使用它,我們首先安裝所需的依賴項.在本章中,我們將演示如何使用流行的 Mysql , TypeORM 提供了對許多關系數據庫的支持,比如 PostgreSQL 、Oracle、Microsoft SQL Server、SQLite,甚至像 MongoDB 這樣的 NoSQL 數據庫.我們在本章中介紹的過程對於 TypeORM 支持的任何數據庫都是相同的.您只需為所選數據庫安裝相關的客戶端 API 庫.

npm install --save @nestjs/typeorm typeorm mysql

安裝過程完成后,我們可以將 TypeOrmModule 導入 AppModule

方法一

app.module.ts

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

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

forRoot() 方法接受與來自 TypeORM 包的 createConnection() 相同的配置對象

方法二

app.module.ts

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

@Module({
  imports: [TypeOrmModule.forRoot()],
})
export class AppModule {}

創建 ormconfig.json,可以將 forRoot()配置抽離出來,不傳入沒有任何選項調用 forRoot()

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "root",
  "database": "test",
  "entities": ["dist/**/*.entity{.ts,.js}"],
  "synchronize": true
}

一旦完成,TypeORM 連接和 EntityManager 對象就可以在整個項目中注入(不需要導入任何模塊)

app.module.ts

import { Connection } from 'typeorm';

@Module({
  imports: [TypeOrmModule.forRoot(), ImageModule],
})
export class AppModule {
  constructor(private readonly connection: Connection) {}
}

存儲庫模式

TypeORM 支持存儲庫設計模式,因此每個實體都有自己的存儲庫.可以從數據庫連接獲得這些存儲庫.該 image 實體屬於該 image 目錄.這個目錄代表了 ImageModule.這是你決定在哪里保留你的模型文件.最好的方法是將它們放在他們的域中, 放在相應的模塊目錄中.

./src/image/entity/image.entity.ts

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

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

  @Column({ length: 50 })
  public name: string;

  @Column({ length: 300 })
  public path: string;

  @Column({ length: 50 })
  public createdBy: string;

  @Column('int')
  public createAt: number;
}

開始使用 image 實體,我們需要讓 TypeORM 知道它插入實體數組:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Image } from './image/entity/image.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [Image],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

同時修改 image.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ImageService } from './Image.service';
import { ImageController } from './Image.controller';
import { Image } from './Image.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Image])],
  providers: [ImageService],
  controllers: [ImageController],
})
export class ImageModule {}

此模塊使用 forFeature() 方法定義在當前范圍中注冊哪些存儲庫.這樣,我們就可以使用 @InjectRepository()裝飾器將 ImageRepository 注入到 ImageService 中:

之后再 service 中進行使用

image.service.ts

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

@Injectable()
export class ImageService {
  constructor(
    @InjectRepository(Image)
    private readonly ImageRepository: Repository<Image>,
  ) {}

  findAll(): Promise<Image[]> {
    return this.ImageRepository.find();
  }
}

不要忘記將 ImageModule 導入根 ApplicationModule.

如果要在導入 TypeOrmModule.forFeature 的模塊之外使用存儲庫,則需要重新導出由其生成的提供程序.您可以通過導出整個模塊來做到這一點,

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Image } from './Image.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Image])],
  exports: [TypeOrmModule]
})
export class ImageModule {}

現在,如果我們在 ImageHttpModule 中導入 ImageModule ,我們可以在后一個模塊的提供者中使用 @InjectRepository(Image).

Image-http.module.ts

import { Module } from '@nestjs/common';
import { ImageModule } from './Image.module';
import { ImageService } from './Image.service';
import { ImageController } from './Image.controller';

@Module({
  imports: [ImageModule],
  providers: [ImageService],
  controllers: [ImageController]
})
export class ImageHttpModule {}

配置自動加載 entity

./ormconfig.json

{
  "type": "mysql",
  "host": "127.0.0.1",
  "port": 3306,
  "username": "xxxxx",
  "password": "xxxxx",
  "database": "ks",
  "entities": ["src/**/*.entity{.ts,.js}"],
  "synchronize": true
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM