Nestjs框架: 集成 TypeORM 和 Mongoose

概述

  • 虽然 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 和 其他

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值