Nestjs 学习系列基础篇8 - 使用TypeORM实现数据持久化(结合mongoDB数据库)

420 阅读2分钟

Nestjs 学习系列基础篇8 - 使用TypeORM实现数据持久化(结合mongoDB数据库)

Typeorm官方文档

TypeORM是什么

TypeORM 是一个ORM框架。ORM(Object–relational mapping) 是指对象关系映射,是一种将某种编程语言中的对象转换为其他不兼容系统中的数据。ORM最常见使用便是对象与数据库表之间的转换。

安装

  • typeorm
  • mongodb 指定版本 3.6.0,高版本的可能会不兼容typeorm
pnpm i typeorm mongodb@"^3.6.0"

封装

src/shared/database.providers.ts

import { ConfigService } from '@nestjs/config';
import { DataSource, DataSourceOptions } from 'typeorm';
import * as path from 'path';

// 设置数据库类型
const databaseType: DataSourceOptions['type'] = 'mongodb';

// 数据库注入
export const DatabaseProviders = [
  {
    provide: 'MONGODB_DATA_SOURCE',
    inject: [ConfigService],
    useFactory: async (configService: ConfigService) => {
      const config = {
        type: databaseType,
        url: configService.get<string>('database.url'),
        username: configService.get<string>('database.user'),
        password: configService.get<string>('database.pass'),
        database: configService.get<string>('database.name'),
        entities: [path.join(__dirname, `../../**/*.mongo.entity{.ts,.js}`)],
        logging: configService.get<boolean>('database.logging'),
        synchronize: configService.get<boolean>('database.synchronize'),
      };
      const ds = new DataSource(config);
      await ds.initialize();
      return ds;
    },
  },
];

使用

src/shared/shared.module.ts

import { Module } from '@nestjs/common';
import { SystemService } from './system.service';
import { ConfigModule } from '@nestjs/config';
import { configModuleOptions } from './configs/module-options';
import { DatabaseProviders } from './database.providers';

@Module({
  // 注册 DatabaseProviders
  providers: [SystemService, ...DatabaseProviders],
  // 暴露 DatabaseProviders
  exports: [SystemService, ConfigModule, ...DatabaseProviders],
  ...
})
export class SharedModule {}

src/user/user.providers.ts

import { User } from './entities/user.mongo.entity';

export const UserProviders = [
  {
    provide: 'USER_REPOSITORY',
    useFactory: async (AppDataSource) =>
      await AppDataSource.getRepository(User),
    inject: ['MONGODB_DATA_SOURCE'],
  },
];

src/user/user.module.ts

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { SharedModule } from 'src/shared/shared.module';
import { UserProviders } from './user.providers';

@Module({
  controllers: [UserController],
  providers: [UserService, ...UserProviders],
  imports: [SharedModule], // 引用模块
})
export class UserModule {}

src/shared/database.providers.ts 中匹配了 entities: [path.join(__dirname, ../../**/*.mongo.entity{.ts,.js})], 文件的路径,这样配置是为了可以灵活的使用不同的数据库,目的是可以扩展更多。

需要把原来的src/user/entities/user.entity.ts 改为 src/user/entities/user.mongo.entity.ts

src/user/entities/user.mongo.entity.ts

import { Column, Entity, ObjectId, ObjectIdColumn } from 'typeorm';

@Entity()
export class User {
  @ObjectIdColumn()
  _id: ObjectId;

  @Column('text')
  phone: string;

  @Column('text')
  name: string;

  @Column('text')
  password: string;

  @Column({ length: 200 })
  email: string;
}

src/user/user.service.ts

import { MongoRepository } from 'typeorm';
export class UserService {
  constructor(
    // 注入 mongo 数据库
    @Inject('USER_REPOSITORY')
    private readonly userRepository: MongoRepository<User>,
  ) {}

  create(createUserDto: CreateUserDto) {
    // 测试 mongo 数据库
    return this.userRepository.save({
      phone: '18712312345',
      name: 'mongo',
      password: '123456',
      email: '1@1.com',
    });
  }
}

项目仓库地址

仓库地址Github: dome-server

注意:基础篇的的代码在 base 分支下