Nest.js学习笔记

252 阅读1分钟
  1. Nest项目创建
$ npm i -g @nestjs/cli\
$ nest new project-name
//项目启动
npm run start
//本地开发修改后监听重启
npm run start:dev

2.Nest设置局部路由前缀

image.png 访问地址:http://localhost:3000/zhanghu/hu

3.Nest设置全局路由前缀 在main.ts中通过

app.setGlobalPrefix()

image.png

访问地址:http://localhost:3000/ZH/zhanghu/hu

4.Nest新增模块

  • Controller:传统意义上的控制器,提供 api 接口,负责处理路由、中转、验证等一些简洁的业务;
  • Service:又称为 Provider, 是一系列服务、repo、工厂方法、helper 的总称,主要负责处理具体的业务,如数据库的增删改查、事务、并发等逻辑代码;
  • Module:负责将 Controller 和 Service 连接起来,类似于 namespace 的概念; 使用 nest-cli 提供的指令可以快速创建文件,语法如下:
$ nest g [文件类型] [文件名] [文件目录(src目录下)]

我们输入:

$   nest g service searchMusic  logical
$   nest g controller searchMusic  logical

image.png

这样便为我们创建好了相应的searchMusic模块

search-music.controller.ts中写入逻辑

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

@Injectable()
export class SearchMusicService {
    searchBySinger(singerName:string){
        if(singerName == '阿信'){
            return '死了都要爱'
        }
        return '未查找到该歌曲作者'
    }
}

search-music.controller.ts中引入search-music.controller.ts,并添加api接口发生post请求(通过 @Body() 来获取请求体(request.body)的参数)

import { Controller,Post, Body  } from '@nestjs/common';
import { SearchMusicService } from './search-music.service';


@Controller('search-music')
export class SearchMusicController {
    constructor(private readonly SearchMusicService: SearchMusicService) {}

    @Post('/searchBySinger')
    getHello(@Body() body: any): string {
      return this.SearchMusicService.searchBySinger(body.singer);
    }
}

测试结果

image.png

补充:5.nest创建Module 打开 app.module.ts:

// src/app.module.ts\
import { Module } from'@nestjs/common';\
import { AppController } from'./app.controller';\
import { AppService } from'./app.service';\
import { UserService } from'./logical/user/user.service';\
import { UserController } from'./logical/user/user.controller';\
\
@Module({\
imports: [],\
controllers: [AppController, UserController],\
providers: [AppService, UserService],\
})\
exportclass AppModule {}

发现使用指令创建文件的时候,已经自动帮我们引入 User 相关文件了,而 main.ts 文件里,又已经引入了 AppModule,并使用 NestFactory 创建了实例。

因此,如果是新建无关痛痒的子模块,即使不新建 Module 文件,也能通过路由访问。

$ nest g module user logical 初始化的 Module 基本都长这个样:

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

@Module({})
export class UserModule {}

我们把 Service 和 Controller 组装起来:

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
export class UserModule {}

这样做有什么好处呢,就是其他 Module 想引入 User 的时候,就不用同时引入 Service 和 Controller 了,我们修改一下 app.module.ts

// src/app.module.ts
import { Module } from'@nestjs/common';
import { AppController } from'./app.controller';
import { AppService } from'./app.service';
// import { UserService } from './logical/user/user.service';
// import { UserController } from './logical/user/user.controller';
import { UserModule } from'./logical/user/user.module';

@Module({
  imports: [UserModule],
  controllers: [AppController],
  providers: [AppService],
})
exportclass AppModule {}