Nest.js入门、数据库连接

2,384 阅读4分钟

介绍

Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。

在底层,Nest使用强大的 HTTP Server 框架,如 Express(默认)和 Fastify。Nest 在这些框架之上提供了一定程度的抽象,同时也将其 API 直接暴露给开发人员。这样可以轻松使用每个平台的无数第三方模块。

安装

    // cli
    $ npm i -g @nestjs/cli
    $ nest new project-name
    
    // git
    $ git clone https://github.com/nestjs/typescript-starter.git project
    $ cd project
    $ npm install
    $ npm run start

    // 手动
    $ npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata
    
  • 安装完成后 不出意外 你得到了一个极其简单的例子

运行应用程序

  • 第一种方式 npm run start 但是此时并不会有热更新
  • 第二种方式 npm run start:dev 这才是 打开的正确姿势
  • 启动完成后 在浏览器输入本地服务器地址http://127.0.0.1:3000 不出意外你将看到hellow Word
  • 所有可运行命令 均在 package.json 文件 scripts 下

应用模块

  • 一个好的应用 模块之间的划分应该是明确的,代码也是一样
  • 创建一个模块
    • 一个模块通常包含 model ,controller, service 文件
    • 输入 nest g controller cats,执行后,若src目录下没有名为 cats 的文件夹,则会创建,然后在其中创建 cats.controller.ts文件,否则将cats.controller.ts 文件,放入到cats 文件夹
    • 输入 nest g service cats, 上同
    • 命令行创建的文件 会自动注册到 app.module.ts中
  • 写一个自定义请求
  • 上边创建完成后,我们得到了一个包含 model ,controller, service 文件的文件夹

cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService]
})
export class CatsModule {}

cats.controller.ts

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service'


// 此时的访问路径为 http://127.0.0.1:3000/cats/getPageList
// cats 对应 @Controller('cats') 的 cats
// getPageList 对应 CatsController 的  @Get('getPageList') 
@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Get('getPageList')
  getPageList(): string  {
    return this.catsService.getPageList();
  }
  
  
  @Post('getPageList')
  getPageList(): string  {
    return this.catsService.getPageList();
  }
}

cats.service.ts

import { Injectable} from '@nestjs/common';

@Injectable()
export class CatsService {
  getPageList() {
    return '这是一个自定义请求';
  }
}

接收路由参数

  • nest 内部定义了一些装饰器, 如获取 get请求的params 可以这样
    import { Controller, Get, Ip, Query, Headers, Post, Param, HttpCode, Body } from '@nestjs/common';
    import { AppService } from './app.service';
    
    @Controller('cats')
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get('test')
      getHello(@Param() Param): string {
        return this.appService.getHello();
      }
    }

mysql数据库连接

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',   // 服务器主机名  本地不用改 或者 127.0.0.1
      port: 3306, // 数据库端口  默认 3306
      username: 'root',  // 数据库用户名
      password: 'root', // 数据库密码
      database: 'test',  // 数据库 存储库
      // 注册 数据库实体类 如 photo/photo.entity.ts  
      // 也可以这样写 "entities": ["dist/**/*.entity{.ts,.js}"],  匹配所有 .entity 文件,
      // 或者直接设置 autoLoadEntities: true,
      entities: [],  
      synchronize: true,
    }),
  ],
})
export class AppModule {}

存储库模式

TypeORM 支持存储库设计模式,因此每个实体都有自己的存储库。可以从数据库连接获得这些存储库。为了继续这个示例,我们需要至少一个实体。我们将使用官方TypeORM文档中的 Photo 实体。(拷贝官网)

  • 注意: 每个实体类 都对应一个数据库的表, 如果不存在则会创建

photo/photo.entity.ts

  import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

  @Entity()
  export class Photo {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({ length: 500 })
    name: string;

    @Column('text')
    description: string;

    @Column()
    filename: string;

    @Column('int')
    views: number;

    @Column()
    isPublished: boolean;
  }

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './photo/photo.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [Photo], // 此处注册实体类
      synchronize: true,
    }),
  ],
})
export class AppModule {}

photo.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PhotoService } from './photo.service';
import { PhotoController } from './photo.controller';
import { Photo } from './photo.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Photo])],
  providers: [PhotoService],
  controllers: [PhotoController],
})
export class PhotoModule {}

不要忘记将 PhotoModule 导入根 ApplicationModule。

photo.controller.ts

import { Controller, Get } from '@nestjs/common';
import { PhotoService } from './photo.service';
import { Photo } from './photo/photo.entity';

  @Controller('Photo')
  export class CatsController {
    constructor(private readonly photoService: PhotoService) {}

    @Get('findAll')
    getPageList(): Promise<Photo[]>  {
      return this.photoService.findAll();
    }
  }

photo.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Photo } from './photo.entity';

@Injectable()
export class PhotoService {
  constructor(
    @InjectRepository(Photo)
    private readonly photoRepository: Repository<Photo>,
  ) {}

  findAll(): Promise<Photo[]> {
    return this.photoRepository.find();
  }
}

  • 上述代码 新建额一个 Photo 的模块,请确保其正确注册,然后不出意外,你的数据库 将会多出一个 Photo 的表,试着插入一条数据,然后访问 http://127.0.0.1:3000/Photo/findAll 你将得到该表的全部数据