使用typescript注解简化开发express

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

ts-express-restful


当我们使用 nodejs express开发web项目时,是否写了很多 路由和 controller 映射的代码?我们的路由规则是否是按照restful规范去实现的呢?
ts-express-restful帮你去简化路由与controller映射的样板代码,如果按照restfu规范,你只需要关注资源提供方式,剩下的交给ts-express-restful.
当然如果你想自定义路由也很简单,只需要简单一句注解就好,感谢spring mvc 给了我很大的参考。

Router与Controller自动映射逻辑


此处ctrl为controller类名 去掉 Controller后缀.如类名为 UserController, ctrl为 user;

Controller函数名 映射的Http Method 映射的路由地址
find /ctrl/ GET
get /ctrl/:id GET
update /ctrl/:id PUT
add /ctrl/ POST
delete /ctrl/:id DELETE
@Router("/other", "GET") /ctrl/other GET

主要函数\注解说明


  • @Restful(mountUrl) 将一个Controller转为一个RestfulController, 此装饰器可以接受一个URL函数,标示此Controller想要挂载的URL,如果没有 挂载的URL为Controller名字去掉Controller后缀
  • @Router(url) 将Controller中的函数转为一个可供外部访问的Http Api, 此装饰器可以自定义Controller中函数对外的URL地址
  • scannerDecorator 此函数会需要扫描注解的路径
  • registerControllerToRouter 此函数会把所有调用了@Restful的controller注册到路由上
  • (controller instance).$isValidId 主要是用于验证此controller 的ID风格,如果此函数返回false,则不是ID
  • (controller instance).$before 调用Controller的每个函数之前会先调用 $before函数,此函数中可以做一些权限校验或者数据统一
  • @ResponseBody() 直接将函数返回内容作为response相应内容
  • @SchemaFilter(schema: any, checkType: boolean) 按照schema指定的格式过滤返回结果, checkType 如果不指定或者未true,将严格检查响应的类型是否和指定的schema类型匹配

使用


// router/index.ts 

import http = require("http");

import {scannerControllers, registerControllerToRouter} from "ts-express-restful";

import path = require("path");
import express = require("express");
var router = express.Router();

scannerControllers(path.join(__dirname, 'controller'));
registerControllerToRouter(router);

export async function initHttp(app) {
    app.use('/api/v1', router);
}
// controller/city.ts
import {AbstractController, Restful, Router} from "ts-express-restful";

//此处可以是 @Restful('/test')
@Restful()
export class TestController extends AbstractController {
    constructor() {
        super();
    }

    $isValidId(id: string) {
        //只有ID是数字是才认为是ID 如 /test/1 可以请求到get  /test/xx 为返回404  /test/other 为映射到 other函数
        return /^\d+$/.test(id);
    }
    
    async $before(req, res, next) {
        console.log("before...");
        next(); //切记需要调用next,否则就停止到这里了
    }

    // 调用地址为 /test/:id
    async get(req, res, next) {
        res.send("get");
    }
    
    // 调用地址为 /test/other
    @Router("/other")
    async other(req, res, next) {
        res.send("other");
    }

    //调用ResponseBody
    @Router("/responseBody")
    @ResponseBody()
    async responseBody(ctx) {
        let id = ctx.req.params.id;
        return this.reply(0, {
            id,
            name: "Restful Test"
        })
    }
}

changelog

  • V 3.0 支持 @SchemaFilter 直接支持按照指定的schema过滤返回给客户端的结果,schema 参考 https://www.npmjs.com/package/json-filter2

ts-express-restful项目地址

转载于:https://my.oschina.net/wanglihui/blog/2961936

你可能感兴趣的:(使用typescript注解简化开发express)