首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL(TypeORM)

本章仅适用于TypeScript

警告在本文中,您将学习如何使用自定义提供程序机制从头开始创建DatabaseModule基于TypeORM包。因此,此解决方案包含大量开销,您可以使用现成的和可用的开箱即用专用@nestjs/typeorm软件包来省略。

TypeORM 绝对是node.js世界中最成熟的对象关系映射器(ORM)。由于它是用TypeScript编写的,因此它与Nest框架非常兼容。要使用此库启动冒险,我们必须安装所有必需的依赖项:

代码语言:javascript
复制
$ npm install --save typeorm mysql

我们需要做的第一步是使用createConnection()typeorm包导入的函数与我们的数据库建立连接。该createConnection()函数返回a Promise,因此我们必须创建一个异步提供程序。

database.providers.ts

代码语言:javascript
复制
import { createConnection } from 'typeorm';

export const databaseProviders = [
  {
    provide: 'DbConnectionToken',
    useFactory: async () => await createConnection({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [
          __dirname + '/../**/*.entity{.ts,.js}',
      ],
      synchronize: true,
    }),
  },
];

提示遵循最佳实践,我们在具有*.providers.ts后缀的分隔文件中声明了自定义提供程序。

然后,我们需要导出这些提供程序,以使其可供应用程序的其余部分访问

database.module.ts

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';

@Module({
  providers: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {}

现在我们可以Connection使用@Inject()装饰器注入对象。依赖于Connection异步提供程序的每个类都将等到a Promise被解析。

存储库模式

该 TypeORM 支持库的设计模式,因此每个实体都有自己的仓库。可以从数据库连接获取这些存储库。

但首先,我们至少需要一个实体。我们Photo将从官方文档中重用该实体。

照片/ photo.entity.ts

代码语言:javascript
复制
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

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

  @Column({ length: 500 })
  name: string;

  @Column('text')
  description: string;

  @Column()
  filename: string;

  @Column('int')
  views: number;

  @Column()
  isPublished: boolean;
}

Photo实体属于该photo目录。这个目录代表了PhotoModule。现在,让我们创建一个Repository提供者:

photo.providers.ts

代码语言:javascript
复制
import { Connection, Repository } from 'typeorm';
import { Photo } from './photo.entity';

export const photoProviders = [
  {
    provide: 'PhotoRepositoryToken',
    useFactory: (connection: Connection) => connection.getRepository(Photo),
    inject: ['DbConnectionToken'],
  },
];

注意在实际应用程序中,您应该避免使用魔术字符串。双方PhotoRepositoryTokenDbConnectionToken应保持在分开的constants.ts文件。

现在,我们可以注入PhotoRepository的到PhotoService用的@Inject()装饰:

photo.service.ts

代码语言:javascript
复制
import { Injectable, Inject } from '@nestjs/common';
import { Repository } from 'typeorm';
import { Photo } from './photo.entity';

@Injectable()
export class PhotoService {
  constructor(
    @Inject('PhotoRepositoryToken')
    private readonly photoRepository: Repository<Photo>,
  ) {}

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

数据库连接是异步的,但是Nest使这个过程对最终用户完全不可见。在PhotoRepository等待数据库连接,并且PhotoService被延迟,直到库已准备好使用。整个应用程序可以在每个类实例化时启动。

这是一个决赛PhotoModule

photo.module.ts

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { DatabaseModule } from '../database/database.module';
import { photoProviders } from './photo.providers';
import { PhotoService } from './photo.service';

@Module({
  imports: [DatabaseModule],
  providers: [
    ...photoProviders,
    PhotoService,
  ],
})
export class PhotoModule {}

提示不要忘记将其导入PhotoModule根目录ApplicationModule

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com