nestJs连接mysql数据库是有一定的版本要求的。(因为使用的是mysql2模块,来连接的mysql,所以会出现因数据库版本太低而连接失败的情况)
mysql数据库版本:>= v5.6.0
;条件允许的情况下,尽量选择最新稳定版本的数据库版本。
通过npm上的比较成熟的依赖包进行数据库的连接,可以节省我们的代码量。更能较少我们的开发时间。也能使我们的代码更加简洁。
这里我们需要用的几个依赖包:mysql2 @nestjs/typeorm
cnpm i mysql2 @nestjs/typeorm -S
mysql2模块我们可以用来连接mysql。
typeorm是一个ORM框架。它的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的小型应用还是拥有多数据库的大型企业应用)应用程序。文档地址:https://typeorm.bootcss.com/
nestJs文档上有有关连接数据库的方式。连接:https://docs.nestjs.cn/8/techniques
在文档上有不止一种的连接方式。这里我使用了其中一种。当然对于数据库的信息我们可以定义到一个配置文档中,然后通过配置引入变量来实现统一的配置信息。但是在这里为了方便阅读,直接就以字符串的方式进行展示了。
app.module.ts
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { TypeOrmModule } from '@nestjs/typeorm';
import { NodeInfoModule } from './modules/nodeInfo/nodeInfo.module';
@Module({
imports: [
// 这里可以用来引入自己的模块
NodeInfoModule,
// 数据库的连接信息
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'lljk',
entities: [__dirname + '/./**/*.entity.{js,ts}'],
synchronize: true,
timezone: 'Z',
}),
],
})
export class AppModule {}
这里有一个坑:因为nest加载回去.dist文件夹下去执行文件,所以这里我们的entities配置需要根据需要进行相应改变。像上面我直接在app.module.ts中使用。我的app.module.ts和其他的模块文件夹是在同一个目录级别的,所以__dirname后面之际使用/去查找相应的entity文件就行。但是如果我们使用的是在配置文件引入的方式,就需要根据配置文件所在位置,相应的去改变文件的查找层次了。否则编译过程中会出现报错的情况。
我们与controller模块同级下创建文件xx.entity.ts文件。(当然这个你自己找位置也可以,或者给所有的entity模块都写到一个文件夹中也可以,只要能够在entities配置中找到相应的文件位置就可以,如果entities配置找不到相应的文件配置,框架就不能关联到相关的表,就会报错)
使用mysql2模块的好处就是对于表我们不需要提前创建好,只要配置好了entity文件,框架会为我们自动创建表,并且在启动的时候维护数据表结构。
文中只进行简单的数据表的配置,如果需要复杂的配置,需要去具体的去查看typeorm文档的实体文档。地址:https://typeorm.bootcss.com/entities
node.entity.ts
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
// name参数是使用的表名称
@Entity({ name: 'neimeng' })
export class Neimeng extends BaseEntity {
// 自增主键
@PrimaryGeneratedColumn({ type: 'int', name: 'id', comment: '链路的id' })
id: number;
// 列配置
@Column({
type: 'varchar',
name: 'lianlu_code',
comment: '链路的编号',
})
lianlu_code: string;
@Column({
type: 'varchar',
name: 'lianlu_name',
nullable: false,
comment: '链路的名称',
})
lianlu_name: string;
@Column('varchar', {
name: 'lianlu_start',
nullable: false,
comment: '链路起始库',
})
lianlu_start: string;
@Column({
type: 'varchar',
name: 'lianlu_end',
nullable: false,
comment: '链路的终止库',
})
lianlu_end: string;
@Column({
type: 'int',
name: 'lianlu_status',
default: 0,
comment: '链路的状态',
})
lianlu_status: number;
}
node.module.ts
在module中注册实体
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { NodeController } from './node.controller';
import { Node } from './node.entity';
import { NodeService } from './node.service';
@Module({
imports: [TypeOrmModule.forFeature([Node])],
controllers: [NodeController],
providers: [NodeService],
})
export class NodeModule {}
注册完之后就可以在service中使用了
node.service.ts
在service中有两种使用方式,一种是使用query builder 语法,一种是使用Repository
1·Repository
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getConnection, Repository } from 'typeorm';
import { Node } from './node.entity';
@Injectable()
export class NodeService {
// 获取总局节点信息
async getNodeList() {
const result = await getConnection()
.createQueryBuilder()
.select() // 这里添加参数会将每一个返回的字段的名称前面都添加一个"参数_"
.from(Node, 'node') // 这里去别名施为了有查询条件的话可以使用node.xxx来进行字段条件判断
.execute(); // 将获取的数据类型转换为json类型
return result;
}
}
关于更多查询条件等,可以查看typeorm文档find选项:https://typeorm.bootcss.com/find-options
2·Query Builder
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getConnection, Repository } from 'typeorm';
import { createNodeDataDto } from './dto/node.dto';
import { Node } from './node.entity';
@Injectable()
export class NodeService {
constructor(
@InjectRepository(Node)
private nodeZongjuRepository: Repository<Node>,
) {}
async findAll() {
let result = await this.nodeZongjuRepository
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();
return result;
}
}
我们可以在find()之后使用链式调用的方式来实现。具体可以查看typeorm文档:https://typeorm.bootcss.com/select-query-builder
做完这些事情那么我们就可以在controller中调用service中的函数,从而执行数据库的相关操作了。