Nestjs 学习系列基础篇8 - 使用TypeORM实现数据持久化(结合mongoDB数据库)
TypeORM是什么
TypeORM 是一个ORM框架。ORM(Object–relational mapping) 是指对象关系映射,是一种将某种编程语言中的对象转换为其他不兼容系统中的数据。ORM最常见使用便是对象与数据库表之间的转换。
安装
typeormmongodb指定版本 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',
});
}
}
项目仓库地址
注意:基础篇的的代码在 base 分支下