对于一个Web API项目,数据库是必不可少的,Nest与数据库无关,容许您轻松地与任何SQL或NoSQL数据库集成。根据您的偏好,您有许多可用的选项。本篇咱们讲解集成MySQL数据库,Nest提供了@nestjs/typeorm包,为了开始使用它,咱们首先安装所需的依赖项。mysql
1 安装依赖sql
typeorm 对 mysql 数据库版本有要求,须要5.6以上数据库
npm install --save @nestjs/typeorm typeorm mysql
2 导入TypeOrmModulenpm
安装完成后咱们在app.module导入TypeOrmModule,json
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; // 引入数据库的及配置文件 import { TypeOrmModule } from '@nestjs/typeorm'; import { Connection } from 'typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: '127.0.0.1', port: 3306, username: 'root', password: 'root', database: 'test', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, }) ], controllers: [AppController], providers: [AppService], }) export class AppModule { constructor(private readonly connection: Connection) {} }
forRoot()方法接受与来自TypeORM包的createConnection()相同的配置对象。另外,咱们能够建立ormconfig.json,这种方式建立的json文件,在测试过程当中,运行报错,具体缘由没有找到。app
synchronize字段表明是否自动将实体类同步到数据库async
3 编写功能模块ide
咱们编写一个模块来测试。新建message文件夹,文件夹下有下面几个文件工具
message.entity.tspost
import { Column, Entity, PrimaryGeneratedColumn, BaseEntity } from 'typeorm'; // 这里能够修改表名 @Entity() export class Message extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column('int', { name: 'user_id' }) userId: number; @Column('text', { name: 'content' }) content: string; @Column('int', { name: 'to_user_id' }) toUserId: number; @Column('datetime', { name: 'created_time' }) createdTime: Date; @Column('int') creator: number; @Column('datetime', { name: 'updated_time' }) updatedTime: Date; @Column('int') updator: number; }
messages.service.ts
import { Injectable } from '@nestjs/common'; // import { Message } from './interfaces/message.interface'; // ORM import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Message } from './message.entity'; @Injectable() export class MessagesService { constructor( @InjectRepository(Message) private readonly messagesRepository: Repository<Message>, ) {} private readonly messages: Message[] = []; async findAll(): Promise<Message[]> { return await this.messagesRepository.find(); } }
messages.module.ts
import { Module } from '@nestjs/common'; import { MessagesService } from './messages.service'; import { MessagesController } from './messages.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Message } from './message.entity'; @Module({ imports: [TypeOrmModule.forFeature([Message])], providers: [MessagesService], controllers: [MessagesController], }) export class MessagesModule {}
messages.controller.ts
import { Controller, Post } from '@nestjs/common'; import { MessagesService } from './messages.service'; import { Message } from './message.entity'; @Controller('messages') export class MessagesController { constructor(private readonly messagesService: MessagesService) {} @Post() findAll(): Promise<Message[]> { return this.messagesService.findAll(); } }
4 导入及运行
app.module.ts文件导入
// messages import { MessagesModule } from './messages/messages.module'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: '94.191.51.170', port: 3306, username: 'wangcong#2020', password: 'wangcong#2020', database: 'blog', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, }), MessagesModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule { constructor(private readonly connection: Connection) {} }
运行项目,用数据库管理工具链接咱们的数据库,能够发现,已经自动建立表,咱们随便加一条测试数据
咱们用postman测试,能够返回咱们加的测试数据