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")
});
网友评论