Typeorm一个orm框架实现js对象与数据库表映射
1.使用nest.js连接数据库之前先简单的介绍一下Typerom这个插件,可以让我们写js对象的形式定义数据库表。
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class UserLoginInfo {
@PrimaryGeneratedColumn() // 这是主键id 需要PrimaryGeneratedColumn这个修饰器去定义
id: number;
@Column() // Column代表的行列修饰器 每一列的属性
phone: number;
@Column()
password: string;
}
Typeorm会根据这个Entity这个修饰器来进行和数据库表的映射,会根据这个类名来进行声明数据库表,会将小驼峰转化成-的形式命名。这样我们就可以是实现对数据库表的增删改操作 2. nest.js提供了Controller、Service、Module等划分,MVC的模式的实现,controller层实现数据请求的处理,将处理过的数据参数传递给Service层,Service实现业务逻辑的实现及数据库表的增删改。根据Module来进行模块划分。 3. 从Module文件来开始结合Typeor来进行数据库连接 依赖包
npm install @nestjs/typeorm typeorm mysql2
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './users/users.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'test', // 数据库名
autoLoadEntities: true, // 自动加载entity文件
synchronize: true, //根据实体自动创建数据库表
}),
UsersModule,
],
})
export class AppModule {}
在主module文件中配置好了后再去创建我们的user模块
@@files user.entity.ts 数据库表声明文件
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class UserLoginInfo {
@PrimaryGeneratedColumn()
id: number;
@Column()
phone: number;
@Column()
password: string;
}
@@files users.controller.ts Controller层文件声明路由
import { Bind, Body, Controller, Delete, Get, HttpStatus, Param, Post, Res } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UserInfo } from "./userInfo.entity";
import { UsersService } from './users.service';
import { Response } from 'express';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post('register')
async register(@Res() res:Response, @Body() createUserDto:CreateUserDto): Promise<Response> {
const userInfo = await this.usersService.create(createUserDto);
let responseObj = {
code: 1,
message: "Ok",
HttpStatus: HttpStatus.OK
};
if (!userInfo) {
responseObj.code = 0;
responseObj.message = "该手机号已经注册过了"
responseObj.HttpStatus = HttpStatus.INTERNAL_SERVER_ERROR
}
return res.status(responseObj.HttpStatus).json({
code: responseObj.code,
data: [],
message: responseObj.message
});
}
@Post('login')
login(@Body() createUserDto: CreateUserDto): Promise<UserInfo[]> {
return this.usersService.login(createUserDto);
}
}
@@files users.service.ts 声明service层文件对业务层逻辑处理
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UserLoginInfo } from './user.entity';
import { UserInfo } from "./userInfo.entity";
@Injectable()
export class UsersService {
constructor(
@InjectRepository(UserLoginInfo)
private readonly usersRepository: Repository<UserLoginInfo>,
@InjectRepository(UserInfo)
private readonly usersInfoRepository: Repository<UserInfo>,
) {}
async create(createUserDto: CreateUserDto): Promise<Boolean> {
const user = new UserLoginInfo();
user.phone = createUserDto.phone;
let hasPhone = await this.findPhoneHandler(user.phone);
if (hasPhone) {
return false;
}
user.password = (createUserDto.phone + '').slice(-6);
let loginInfo
try {
loginInfo = await this.usersRepository.save(user)
} catch (error) {
throw new Error(error);
}
return loginInfo;
}
async findPhoneHandler (phone: number): Promise<Boolean> {
let hasPhone = await this.usersRepository.find({
where: {
phone: phone
}
})
if (hasPhone && hasPhone.length > 0) {
return false
}
return true
}
async login(query: CreateUserDto): Promise<UserInfo[]> {
const loginInfo = this.usersRepository.find({
where: {
phone: +query.phone
}
});
const userInfo = this.getUserInfo({phone: loginInfo[0].phone})
return userInfo;
}
async getUserInfo(param: {
phone: string
}): Promise<UserInfo[]> {
return this.usersInfoRepository.find({
where: {
phone: param.phone
}
});
}
}
@@files users.module.ts 声明module层引入依赖模块及数据库表注册
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserLoginInfo } from './user.entity';
import { UserInfo } from './userInfo.entity';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
imports: [TypeOrmModule.forFeature([UserLoginInfo, UserInfo])],
providers: [UsersService],
controllers: [UsersController],
exports: [UsersService]
})
export class UsersModule {}
@@ files create-user.dto.ts 创建dto文件
export class CreateUserDto {
phone: number;
code: SVGStringList;
password?: string;
}
这样我们nets.js就连接好了数据库。
gitee代码链接gitee.com/xuxuqingson…