ts + reflect 编程, 实现 类 spring boot rest 功能 【二】

es6 提供了 reflect api, es7 的 提供有装饰器。 我们可以尝试用装饰器 + reflect 实现 spring boot rest 注解。

const Koa = require('koa');
const Router = require('@koa/router');
const bodyParser = require('koa-bodyparser')
const app = new Koa();
let router = new Router();
app.use(bodyParser());

@RestController("/accounts")
class AccountController {

    @GetMapping("/id")
    getId(ctx) {
        ctx.body = 10086;
    }

    @GetMapping("/")
    getQuery(ctx) {
        ctx.body = ctx.query;
    }

    @PostMapping("/")
    addData(ctx) {
        ctx.body = ctx.request.body;
    }
}

function RestController(prefix) {
    return function (target) {
        target.prefix_path = prefix;
    }
}

function mapping(method) {
    console.log(method);
    return (path) => {
        return (target, name, descriptor) => {
            let endpoints = Reflect.get(target, "endpoints");
            const data = {
                "path": path,
                "fn": target[name],
                "method": method,
            };
            console.log(data);
            if (endpoints == null) {
                Reflect.set(target, "endpoints", [data]
                )
            } else {
                endpoints.push(data)
                Reflect.set(target, "endpoints", endpoints)
            }
        }
    }
}

function GetMapping(path) {
    return mapping("get")(path);
}

function PostMapping(path) {
    return mapping("post")(path);
}

AccountController.prototype["endpoints"].forEach(
    (item) => {
        router[item.method.toLowerCase()](item.path, item.fn);
    }
);

// @ts-ignore
router.prefix(AccountController.prefix_path);

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
    console.log("listen 3000")
});
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容