概述
- 虽然 Prisma 用起来非常舒服,不需要创建
repository
,它就能实现很好的数据库连接 - 同时,它对 TypeScript 的支持也非常出色
- 不过,在一些极端应用场景下,尤其是在关键性数据库方面,TypeORM 的兼容性比某些其他工具要好。
集成 TypeORM
1 ) 安装依赖
- $
$ npm install --save @nestjs/typeorm typeorm mysql2
2 ) 配置
环境变量 .env 的配置
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=example
DB_DATABASE=testdb
DB_AUTOLOAD=true
DB_SYNC=true
app.module.ts
import { Module } from '@nestjs/common';
import { AppController }from './app.controller';
import { ConfigModule }from './common/config/config.module';
import { LogsModule } from './common/logger/logs.module';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import { User } from './user/user.entity';
@Module({
imports: [
ConfigModule,
LogsModule,
TypeOrmModule. forRootAsync({
inject:[ConfigService],
useFactory:(configService: ConfigService)=> ({
type: configService.get('DB_TYPE'),
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_DATABASE'),
autoLoadEntities: Boolean(configService.get('DB_AUTOLOAD', false)),
synchronize: Boolean(configService.get('DB_SYNC', false)),
}) as TypeOrmModuleOptions,
}),
TypeOrmModule.forFeature([User])
],
controllers: [AppController],
providers: [],
});
export class AppModule {}
- 它是通过创建
TypeOrmModule.forRootSync
并传入数据库连接配置来实现与数据库的连接 - 配置完成后,就可以创建对应的实体,比如创建
user
实体
3 ) 创建实体
src/user/user.entity
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
}
4 ) 编辑测试控制器
app.controller.ts
import { Controller, Get, Version } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user/user.entity';
import { Repository } from 'typeorm';
@Controller()
export class AppController {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>
){}
}
@Get()
// @Version('1')
async getHello(): Promise<any> {
const res = await this.userRepository.find();
return res;
}
- 打开浏览器访问
localhost:3030/api/v1
,得到的结果和预期一致 - 至此,TypeORM 的集成就算完成了
集成 Mongoose
1 ) 安装
- $
npm i @nestjs/mongoose mongoose
2 ) 配置
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [MongooseModule.forRoot('mongodb://root:example@localhost:27017/nest')],
})
export class AppModule {}
3 ) 新建 mongo 服务
docker-compose.mongo.yaml
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
ports:
- 27017: 27017
mongo-express:
image: mongo-express
restart: always
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
ME_CONFIG_BASICAUTH: false
ports:
- 8081:8081
- $
docker compose -f docker-compose.mongo.yml up -d
- 进入
4 ) 创建数据库
- 打开 8081 UI 界面, 创建一个名称为 nest 的数据库
5 )编辑 schema
src/user/user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';
export type UserDocument = HydratedDocument<User>;
@Schema()
export class User {
@Prop()
username: string;
@Prop()
password: string;
}
export const UserSchema = SchemaFactory.createForClass(User);
6 ) 在模块中注入
app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { AppController } from './app.controller';
import { User, UserSchema } from './user/user.schema';
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])
],
controllers: [AppController],
providers: [],
})
export class AppModule {}
7 ) 控制器的配置
app.controller.ts
import { Controller, Get, Version } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './user/user.schema';
import { Model } from 'mongoose';
@Controller()
export class AppController {
constructor(
@InjectModel(User.name)
private userModel: Model<User>
){}
}
@Get()
// @Version('1')
async getHello(): Promise<any> {
const res = await this.userModel.find();
return res;
}
8 ) 创建数据并测试
添加测试数据
- 打开 8081 UI 界面, 在 nest 数据库中,新增 相关 collection, 如新建 users,这里后面多加 s
- 之后,自行添加 document, 注意 “_id” 不要动,添加 username 和 password 字段就行
为管理员账号分配权限
- $
docker ps | grep mongo
找到容器名 - $
docker exec -it nestjs-starter-mongo-1 mongosh -u root -p
之后,输入密码 - $
show dbs;
- $
use nest;
- $
db.createUser({user: 'root', pwd: 'example', roles: [{role: 'dbOwner', db: 'nest'}]})
- 如果返回
{ ok : 1 }
就成功了
- 如果返回
测试
- localhost:3030/api/v1
- 能返回数据,就成功了
当然,也可按照文档上,另一种方式来配置 Schema 和 其他