文章目录

前情概要

上篇文章把action的注册讲完了,但是我们的处理函数没有指定可接受的httpmethod,也没有别名上面的。下面我们使用typescript的特性之一装饰器来实现一把这个特性。

在控制器和处理函数的注册篇中有说到的第三,第四个参数就在这里排上用场拉。
SetActionDescriptor(cName, aName, undefined, undefined, _reg_controller_name, cType, aType)//加入缓存
第三个参数[httpMethod] 请求方法类型。默认给undefined,后续再通过扫描action上面的特性标签增加进来
第四个参数 [actionName] 路由action名字。默认给undefined,后续再通过扫描action上面的特性标签增加进来

get,post,actionname的装饰器实现方式

代码非常简单,通过SetActionDescriptor函数对当前的action的某些属性进行重写。

typescript的装饰器目前来说还是一个实验性的功能,依照微软的尿性,应该也没变动了,就算有也是增加新功能新特性。
然后装饰器这玩意和后端语言的比如dotnet的特性(attribute)、java的标注等比较相似。可以给方法增加一些额外的数据等。具体,可查看typescript 装饰器参考文档

import { SetActionDescriptor } from './RouteFactory';
import { ActionParamDescriptor, SetActionParamDescriptor, parameterFromType } from './RouteHandler';
/*** 标记当前方法只接受post请求* * @export* @returns */
export function post() {return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {SetActionDescriptor(target.constructor.name, propertyKey, 'post')}
}
/*** 标记当前方法只接受get请求* * @export* @returns */
export function get() {return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {SetActionDescriptor(target.constructor.name, propertyKey, 'get')}
}
/*** 重写当前方法的名字,请求使用重写后的名字进行调用* * @export* @param {string} actionName * @returns */
export function actionName(actionName: string) {return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {SetActionDescriptor(target.constructor.name, propertyKey, undefined, actionName)}
}

装饰器使用列子

觉不觉得眼熟?是不是和C#、java里面的特性、标注差不多。

//HostController.ts
import { BaseController, get, post, auth, actionName, ViewResult } from "gd-express-basic";export class HostController extends BaseController {@get()public index() {return this.view("hostIndex", {});}@auth()@post()@actionName("saveHost")public hostAdd() {return this.view("hostAdd", {});}
}

装饰器的基本原理

HostController.ts 为typescript源文件代码。
HostController.js为使用tsc编译为es6后的代码。

//HostController.js
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
//decorators 就是我们声明的装饰器返回的处理闭包函数啦var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);//d(target, key, r) ,调用函数,实际上就是return function (target: any, propertyKey: string, descriptor: PropertyDescriptor)调用这里返回的这个function。else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
const gd_express_basic_1 = require("gd-express-basic");
class HostController extends gd_express_basic_1.BaseController {index() {return this.view("hostIndex", {});}hostAdd() {return this.view("hostAdd", {});}
}
// 1.执行__decorate函数
__decorate([gd_express_basic_1.get(),//调用我们声明的装饰器,返回要处理函数(闭包)__metadata("design:type", Function),__metadata("design:paramtypes", []),__metadata("design:returntype", void 0)
], HostController.prototype, "index", null);
__decorate([gd_express_basic_1.auth(),gd_express_basic_1.post(),gd_express_basic_1.actionName("saveHost"),__metadata("design:type", Function),__metadata("design:paramtypes", []),__metadata("design:returntype", void 0)
], HostController.prototype, "hostAdd", null);
exports.HostController = HostController;
//# sourceMappingURL=HostController.js.map

简单来说就是在源文件加载的时候执行一次__decorate函数,__decorate函数内可以简单理解为调用我们的声明的装饰器函数返回的闭包函数。

到此,我们的controller和action的发现和配置基本上算完成了。

转载于:https://www.cnblogs.com/calvinK/p/nodejs-mvc-controller-action-attribute-auto-register.html

【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理函数装饰器注册篇(5/8)【controller+action】...相关推荐

  1. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  2. 七天来学习ASP.NET MVC (两)——ASP.NET MVC 数据传输

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上.因此须要确保您是否掌握了上一节的内容. 本章的目标是在今天学习结束时利用最佳实践解决方式创建一个小型的M ...

  3. 从零开始实现一个简易的Java MVC框架(九)--优化MVC代码

    前言 在从零开始实现一个简易的Java MVC框架(七)--实现MVC中实现了doodle框架的MVC的功能,不过最后指出代码的逻辑不是很好,在这一章节就将这一部分代码进行优化. 优化的目标是1.去除 ...

  4. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  5. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建项目

    打开VS2010,在主菜单选择文件,新建,项目,在如图1所示的弹出窗口中已安装的模板下选择C#的Web模板,然后选择"ASP.NET MVC 3 Web应用程序",将项目名称修改为 ...

  6. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  7. asp.net mvc+httpclient+asp.net mvc api入门篇

    第一步:创建一个ASP.NET MVC API项目 第二步:在api项目里面创建一个类 public class Student{public int Id { get; set; }public s ...

  8. spring框架mvc框架_Spring的MVC测试框架入门–第1部分

    spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...

  9. 【MVC】ASP.Net MVC 4项目升级MVC 5的方法

    1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...

最新文章

  1. 请概述可视化卷积神经网络的中间输出的基本思想。_卷积神经网络为什么能称霸计算机视觉领域?...
  2. .Net Web开发技术栈
  3. Map与object的区别
  4. [Abp 源码分析]ASP.NET Core 集成
  5. HDU2683——欧拉完全数
  6. 玩转oracle 11g(48):oracle命令窗口执行sql语句
  7. 这河里吗?Go 里边空指针还能调用对象方法!
  8. 数据库-mysql概述
  9. 我愿意为你在城里的月光下温暖冷冷的爱情
  10. 计算语言学和自然语言信息处理研究和应用综述(一)
  11. 下载蓝盒插件_chrome迅雷下载插件-迅雷下载支持插件下载 v3.1官方版--pc6下载站...
  12. Win11中文包下载失败?Win11无法安装中文包语言包解决方法
  13. 永洪BI在 Linux/Unix 下 jdk 环境如何配置?
  14. 手把手教你安装Sketch破解版和measure插件 1
  15. 人类基因编辑国际峰会周琪院士谈基因编辑的未来
  16. 关于Unity屏幕分辨率的比例
  17. 采坑:天地图token使用限制
  18. idea翻译插件:Translation
  19. python接入poco_使用python+poco+夜神模拟器进行自动化测试实例
  20. 药店app的布局html,药店列表(小三件套版本).html

热门文章

  1. git推送出现fatal: the remote end hung up unexpectedly
  2. mysql服务器cpu资源占用满
  3. java:输出流程printStream
  4. 北京发布全国首个“水下物联网”系统
  5. [Javascript]XMLHttpRequest对象实现下载进度条
  6. 使用pinyin4j将中文转换为拼音
  7. MySQL 加锁处理分析(二)
  8. Lesson 6   Smash-and-grab 砸橱窗抢劫
  9. vs2008中调用matlab生成的dll
  10. Hello,Views(五)自动填充文字AutoCompleteTextView(附源码)