美文网首页
ts + reflect 编程, 实现 类 spring bo

ts + reflect 编程, 实现 类 spring bo

作者: ithankzc | 来源:发表于2021-11-08 22:33 被阅读0次

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")
});

相关文章

网友评论

      本文标题:ts + reflect 编程, 实现 类 spring bo

      本文链接:https://www.haomeiwen.com/subject/ayyjzltx.html