segmentfault官方|为 Express 开外挂( 二 )


router.post( '/', (req: Request, res: Response) => {res.send( 'Hello post!')});
router.put( '/', (req: Request, res: Response) => {res.send( 'Hello put!')});
router.delete( '/', (req: Request, res: Response) => {res.send( 'Hello delete!')});
router.get( '/user', (req: Request, res: Response) => {res.send( 'Hello api/user!')});
exportdefault router;
接着在 app.ts 中使用 , 由于express.Router是个中间件 , 因此可以使用 app.use来使用:
// app.ts
// 删除原来路由声明
import router from "../controller/app.router";
app.use( '/api', router);
这里 app.use 第一个参数 /api 表示这一组路由对象的根路径 , 第二个参数 router 表示一组路由对象 。
于是就实现了下面 API 接口:

  • /api
  • /api/user
确定所有接口正常运行后 , Leo 琢磨着 , 既然 Express 每个路由都是由路由名称和路由处理方法组成 , 那为什么不能给 Express 加个外挂?为每个路由添加装饰器来装饰 。
幸运的是 , 已经有大佬实现这个外挂了 , 它就是今天主角——OvernightJS 。
下面一起看看这个很棒的 OvernightJS 吧 。
二、基础知识介绍
segmentfault官方|为 Express 开外挂
本文插图

在开始介绍 Overnight 之前 , 我们先回顾下“装饰器”和“Reflect”:
1. 装饰器
1.1 什么是装饰器?
Type 中 , 装饰器(Decorators)是一种特殊类型的声明 , 它能够被附加到类声明、方法、访问符、属性或参数上 , 本质上还是个函数 。
装饰器为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式 。
需要记住这几点:
  • 装饰器是一个声明(表达式);
  • 该表达式被执行后 , 返回一个函数;
  • 函数的入参分别为 target、name 和 deor;
  • 执行该函数后 , 可能返回 deor 对象 , 用于配置 target 对象;
更多装饰器详细介绍 , 请阅读文档《Type 装饰器》:
https://www.tslang.cn/docs/handbook/decorators.html 。
1.2 装饰器分类
装饰器一般包括:
  • 【segmentfault官方|为 Express 开外挂】类装饰器(Class decorators);
  • 属性装饰器(Property decorators);
  • 方法装饰器(Method decorators);
  • 参数装饰器(Parameter decorators);
1.3 示例代码
这里以类装饰器(Class decorators)为例 , 介绍如何使用装饰器:
functionMyDecorators(target: Function): void {
target.prototype.say = function: void {
console.log( "Hello 前端自习课!");
};
}
@MyDecorators
class LeoClass {
constructor{}
say{console.log( "Hello Leo")}
}
letleo = new LeoClass;
leo.say;
// 'Hello Leo!';
1.4 编译结果
装饰器实际上非常简单 , 编译出来以后 , 只是个函数 , 我们接着看 。
这里以《1.3 示例代码》为例 , 看看它的编译结果:
"use strict";
var __decorate = (this && this.__decorate) || function(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDeor(target, key) : desc, d;
if(typeof Reflect === "object"&& typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);


推荐阅读