Nestjs

Nestjs

 

安装

npm i -g @nestjs/cli
nest new project-name

然后yarn start,在localhost:3000可以看到Hello World了。

模版代码:

src
|--app.controller.ts
|--app.service.ts
|--app.module.ts
|--main.ts

传统MVC的分层结构:

  • controller就是传统意义上的控制器,提供api接口

  • service又称为Provider,是一系列服务、repo、工厂方法、helper的总称

  • module是controller和provider的集合,类似于namespace的概念,支持module内部controller和provider的注入互相关联

上面这些概念我会逐步在后文介绍使用。先看一下main.ts,这个是入口文件。这里利用了一个叫NestFactory方法创建了这个nest应用。有Spring开发经验的后端对此一定不会太过陌生。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

Controller

Controller在上面也提了,就是传统意义上的控制器,用户接受request再返回response。

Routing

装饰器@Controller很好用,可以将路由直接标志在类和函数头上,很简洁地实现了路由去中心化。

// nest
@Controller('hello')
export class AppController {

  @Get('world')
  getHello(): string {
    return 'Hello World';
  }
}

相比于express的原始路由,nest装饰器显然更具工程化。

// express
AppController.get('/world', function getHello() {
    return 'Hello World'
});

router.use('/hello', AppController);

请求

请求类的装饰器封装了express handler的参数和一些资源,使用方法如下例所示:@Request()映射的就是express handler(req, res, nest)第一个参数req。

@Controller('hello')
export class AppController {

  @Get('world/:id')
  getHello(@Response() res, @Param('id') id): string {
    res.status(HttpStatus.OK).json('hello world')
  }
}

我这里列了几个nest装饰器和handler资源的映射关系。开发中常用的req.paramsreq.headers也做了封装,coding时可以免去一些繁琐的判断语句。想看完整版可以点这里

DecoratorHandler
@Request()req
@Response()res
@Next()nest
@Param(key?: string)req.params / req.params[key]
@Headers(name?: string)req.headers / req.headers[name]

资源

Nest对http的资源请求也做了配置,一系列常用的装饰器如@Get用来指明request方法(支持通配),@Header@HttpCode用于指定respose的返回头和状态码等等。有兴趣的朋友可以去开发者文档具体阅读细节,这里不再深入研究。

@Get('ab*cd')
@Header('Cache-Control', 'none')
@HttpCode(204)
findAll() {
  return 'This route uses a wildcard';
}

Provider

Provider就是MVC开发中的服务,是一系列services, repositories, factories, helpers等等的总称。我们定义一个provider如下,Nest就是利用一个叫@Injectable()的装饰器实现注入依赖。

// app.service.ts

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

如下,Controller中使用的是构造器注入的方式。注意下面加了private readonly,这是ts快速初始化私有域的语法糖。

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

Module

OK,上面提到了Provider注入,那怎么将Controller和Provider相关联呢?Module出场了。先看代码:

// app.module.ts

@Module({
  imports: [otherModule],
  controllers: [AppController],
  providers: [AppService],
})

export class AppModule {}

Module还是挺直观的:provider和controller就是上文提到的服务和控制器;imports里引入的是其他module的实例。

module structure

OK,来总结一下什么是module

A module is a class annotated with a @Module() decorator. The @Module() decorator provides metadata that Nest makes use of to organize the application structure.

简单来说,Module是个namespace或是scope的概念,是一系列Controller和Provider的方法集,也可以看成一种应用的组织形式。在Module内部,nest实现了注入关联。

Middleware

Express还有个概念middleware,感兴趣的朋友可以看我的博客《Express Middleware》。Next封装了express,自然也少不了middleware。Nest middleware是依靠继承一个叫NestMiddleware类实现的,它也可以通过注入实现。

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req, res, next) {
    console.log('Request...');
    next();
  }
}

我们在Module添加Middleware配置。如下所示,http请求会在到达AppController前执行middleware的use——打印Request...

// app.module.ts
export class ApplicationModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(AppController);
  }
}

Nest还提供了函数中间件、链式中间件、全局中间件等等配置方式,感兴趣的朋友可以参阅开发者文档。

原文地址:https://www.jianshu.com/p/4f378b428214

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一套目前来说最好的nestjs实战教程,提供QQ长期问答服务. 本人从 08 年到 18 年一直从事于 PHP 的开发。从 18 年开始转向 Typescript+React+Nestjs 的技术栈。目前来说 React 应该是一个非常好用的前端框架,生态非常完善,并且十分灵活简单。Nestjs 则是 Node.js 中唯一且无敌存在的后端 web 框架。因为我个人从事这套技术栈开发已经 4 年多,所以颇有心得,做了这套 React18 视频教程和 Nestjs 实战视频教程。现在视频教程也是刚刚开始做了一部分,还在持续更新。使用 TS 全栈开发可以基本涵盖各种平台的方方面面,比如开发桌面应用的 Electron, 开发小程序的 Taro, 开发 Spa 中后台的 React,开发 SSR 网站的 next.js,开发移动应用的 React Native, 开发 CLI 的 Yargs, 以及开发后端的 Nestjs。基本学会一套,全面够用,再加上 Monorepo 组织结构,一个仓库所有平台都可以搞定。 包含以下知识点 - 掌握Nestjs框架的依赖注入,模块,提供者,生命周期等概念- 掌握DTO数据验证,响应序列化,异常过滤器等常用功能- 学会编写一些常用的class-validator验证约束- 熟练掌握Typeorm以及Nestjs与Typeorm结合开发- 学会整合Swagger输出Open API文档- 掌握TS装饰器以及反射元数据的定义和使用- 编写一些数据库相关的数据验证约束(比如树形表的同级别某字段唯一验证等)- 学会通过继承并魔改Nestjs源码编写自定义的全局验证器- 可以编写自定义的配置系统以及核心功能包- 学会自定义的代码组织方式(比如教程中我把默认的Nestjs应用改成Util+PluginModule模式)- 掌握编写一些常用的Util仓库(比如数据库,Redis,Restful)- 利用Yargs结合魔改后的框架可以编写一些自定义CLI命令(比如数据迁移,数据填充等)- 掌握如何利用阿里云/腾讯云推送邮件和短信- 掌握使用消息列队(MQ)的方式异步推送邮件和短信- 掌握守卫原理以及编写一些用户验证的守卫- 编写一个完善的用户系统(JWT认证,短信/邮件登录,短信/邮件注册,找回密码,绑定手机和邮箱等)- 熟练地通过编写装饰器去实现一些常用的功能- 通过SSE,WebSockets实现用户的上线,下线以及消息实时推送,消息广播等- 学会使用云存储来上传文件- 学会大文件断点雪川- 实现RBAC的权限系统- 理解请求范围概念以及性能方便的考量- 自己构建配置系统,实现配置验证以及通过YAML或数据库来进行动态配置- 通过适用Vscode进行Debug以及编写Jest测试来提升开发效率与程序的可用性- 学会使用Node来编写自定义的CLI命令- 利用NestCURD进行快速开发- 学会Graphql替代Restful写API- 使用Mongodb替代关系型数据库- 掌握一些常用的打包工具,比如通过ncc打包成单文件,通过pack打包成二进制等- 学会一些常用的部署方式,比如通过nginx+pm2反向代理部署,devops自动化CI,CD等- 学会使用pnpm workspaces来使用monreopo组织代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值