使用typescript注解简化开发express

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/:idGET
update/ctrl/:idPUT
add/ctrl/POST
delete/ctrl/:idDELETE
@Router("/other", "GET")/ctrl/otherGET

主要函数\注解说明


  • @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

ts-express-restful项目地址

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值