装饰器赋能-nestJs概念初识

  猫眼郑志昊提出连接、赋能、破界是互联网下半场的创新法则。赋能这个词个人理解的意思是赋予更多的能力,创造更多的价值。例如技术赋能、数据赋能、运营赋能等等。
此次我们介绍的框架是nestJs,nestJs是一个利用装饰器赋能的MVC后端框架(nodeJs + Typescript)

WWH-WHAT-装饰器赋能

装饰器赋能指的是利用装饰器附加一些额外的属性给特定的类、方法或者属性,举个例子假如你有一把普通宝剑,这把宝剑的攻击力只有10,不过这把宝剑上有三个宝石镶嵌孔,可以将得到的宝石镶嵌上去增加宝剑的威力,如果此时主人翁有红、绿、蓝三个宝石分别可以增加攻击力10、20、30,如果将这些宝石都镶嵌上去那么这把宝剑就不是一把普通的宝剑,而是攻击力达到70的绝世好剑了,下图代码简单说明:
 // 普通宝剑类
export class Sword { 
  
  power: number;

  init(power: number): void {
    this.power = power;
  }

  constructor() {
    this.init(10)
  }

  showPower () {
    console.log(`power is ${this.power}`)
  }

} 

let commonSword = new Sword();
commonSword.showPower(); // power is 10

// 红宝石装饰器
export function BlueJewel(target, key, descriptor) {
  const method = descriptor.value;
  let powerPlus = 10;
  let ret;
  descriptor.value = (...args) => {
    args[0] += powerPlus;
    ret = method.apply(target, args);
    return ret;
  }
  return descriptor;
}

// 镶嵌了红宝石的普通宝剑
 // 普通宝剑类
export class Sword { 
  
  power: number;

  @RedJewel //红宝石赋能
  init(power: number): void {
    this.power = power;
  }

  constructor() {
    this.init(10)
  }

  showPower () {
    console.log(`power is ${this.power}`)
  }

} 

let redJewelSword = new Sword();
redJewelSword.showPower(); // power is 20 =》 赋能后攻击力提升了10

WWH-HOW-nestJs如何赋能

// 举个例子
const ROLE_AMDIN = 'admin'; // 管理员角色

@Controller('api')  // 使用@Controller赋能使该类拥有controller的特性,可以通过/api前缀访问对应的handler
@UseGuards(RolesGuard) // 使用@UseGuards赋能,使得该类的每一个handler均使用RolesGuard做路由守卫
export class ApiController {

  constructor(private readonly apiService: ApiService) {}
  @Get('findAll') // 使用@Get赋能, 通过get请求方式访问 /api/findAll 地址请求该handler
  async findAll() {
    return this.apiService.findAll(); // 自动判断是否使用jsonParse转为json数据,正常返回即可
  }

  @All() //使用@All赋能,是的所有请求方式都可以请求该handler; 因为path为空,所以路由挂在了根部位置,通过/api访问, 声明为All的话 可以使用method为 post、get、option、put、delete等方式进行请求获取数据
  allMode(@Req() request, @Query() query, @Body() body) { // query为url上携带的查询数据eg. http://localhost:3000/api?a=1&b=2; body为post传过来的数据
    console.log({query, body});
    return {};
  }

  @Get('testInjectDto')
  testInjectDto(@Query() apiDto: ApiDto) { // Api接口有name、url、params属性 相同名字的会被自动注入进而使用 eg.http://localhost:3000/api/testInjectDto?url=www.baidu.com&name=baidu&uuu=3
    // apiDto.uuu 会报错
    console.log(apiDto);
    return apiDto;
  }
  @Roles(ROLE_AMDIN) //使用@Roles赋能使得访问该handler前会验证用户的权限 heander里面设置[{"key":"user","value":"{\"name\":\"a\",\"roles\":[\"admin\"]}","description":"","enabled":true}]
  @Get('save')
  @UsePipes(new ValidationPipe()) // 增加验证系统
  async save(@Query() apiDto: ApiDto) {
    this.apiService.create(apiDto);
    return 'success';
  }
}

WWH-WHAT-nestJs是什么

  1. nestJs是一个利用装饰器赋能的MVC后端框架
  2. 面向对象编程框架
  3. 基于express与socket.io
  4. 语法结构与ng2+类似,上手快,结构清晰
  5. 利用依赖注入机制,管理各个组件依赖
  6. 随时切换微服务与web服务,内置TCP通讯协议(微服务)、redis协议与HTTP通讯协议(web服务),支持其他自定义传输协议(易扩展性:通过实现自定义接口可以使用其他传输协议。eg.RabbitMq协议等)
理解几个概念
  1. 依赖注入:理解依赖注入之前,需要先明白什么是控制反转(IOC),简单的理解就是创建对象的控制权移交出去(由框架来创建),它包括依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)两部分,依赖注入指框架通过对应的参数类型注入相应的对象,那么怎么知道这个对应的对象呢,其实涉及到依赖查找这一部分,简单的来说,框架会将需要注入的对象创建好放在一个容器中,当需要注入的时候在容器中查找有没有,有就直接注入,没有就创建一个放进容器里,所以此时大部分依赖注入的对象都是单例的(即同一个对象)。

WWH-WHAT-nestJs主要部件

  1. Module 模块-按业务逻辑划分
  2. Controller 控制器-处理请求和响应数据的部件(类比java的Action)
  3. Component 组件-处理实际业务逻辑的部件(类比java的Service)
  4. Middleware 中间件-路由处理Handler前的数据处理层
    4.1 作用域-Module
    4.2 举例-日志处理中间件、用户认证中间件等
    4.3 访问域-由于nestJs的中间件和express的中间件一直,所以可以访问整个request、response的上下文
    4.4 执行顺序-路由处理Handler前
  5. Pipe 管道-数据流处理(在中间件后路由处理前做数据处理)
    5.1 作用域-Controller中的Class层、Method层、Argument层、全局作用域
    5.2 举例-数据验证相关的验Pipe
    5.3 访问域-数据值、对应的元数据
    5.4 执行顺序-中间件层Middleware处理后、路由处理Handler前
  6. Guard 守卫-决定请求是否可以到达对应的路由处理器
    6.1 作用域-Controller中的Class层、全局作用域
    6.2 举例-角色守卫
    6.3 访问域-能够知道当前的执行上下文(请求到达的是哪个Controller里面的哪个Handler)
    6.4 执行顺序-中间件Middleware之后、拦截器Interceptor之前
  7. Interceptor 拦截器
    7.1 作用域-全局作用域
    7.2 举例-日志拦截器、事务处理拦截器、异常处理拦截器等
    7.3 访问域-能够知道当前的执行上下文(请求到达的是哪个Controller里面的哪个Handler)
    7.4 执行顺序-守卫Guard之后、管道Pipe之前


    各部件请求顺序图

    未完待续。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 如果让我自己选择的话,《飞越来生缘》这部电影估计我不会看完,但它是必须完成的限时任务,所以我在中间插入观看了一部两...
    铱漩娜阅读 3,395评论 0 2
  • 如果在童年的时候你就明确的知道自己是怎么死的,你会怎么过这一生? 这个问题很有趣,大学期间,基本上把豆瓣top25...
    杨pure阅读 266评论 0 1
  • 02 昨天我在家里写稿。 白饭突然在大厅高声大喊:“没网啦没网啦!” 我爸正好从外面工作回来,听见了白饭的声音,一...
    讲故事的余姑娘阅读 115评论 1 3