为 egg 框架提供一些有用的修饰器
- @ResponseBody: 和
spring-boot
中的@ResponseBody
用法类似 - @ResponseJson: 和
@ResponseBody
类似, 转换 response 为指定的 json 结构 - @RequestMapping: 和
spring-boot
中的@RequestMapping
用法类似 - @RequestParam: 和
spring-boot
中的@RequestParam
用法类似 - @RequestQuery: 获取 url 中 query 的数据
- @RequestBody: 获取 post body 中的数据
egg-decorator 版本 | egg 1.x |
---|---|
1.x | 😁 |
0.x | ❌ |
- 修改
tsconfig.json
, 开启 ts 的修饰器支持, 添加支持修饰器的编译选项
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
- 修改
{app_root}/config/plugin.js
// {app_root}/config/plugin.js
exports.fancyDecorator = {
enable: true,
package: 'egg-fancy-decorator',
};
原来在 egg 中使用 router 和 controller 的方式
// router.ts
import { Application } from 'egg';
export default (app: Application) => {
const { controller, router } = app;
router.get('/api/project/list', controller.project.list);
router.post('/api/project/find', controller.project.find);
router.post('/api/project/find2', controller.project.find);
};
// controller/test.ts
import { Controller } from 'egg';
export default class TestController extends Controller {
public async list() {
const { ctx } = this;
const { query } = ctx;
ctx.body = await ctx.service.project.list({
pageSize: query.pageSize,
page: query.page,
});
}
public find() {
const { ctx } = this;
const { body } = ctx;
const { keyword } = body;
console.log(keyword);
ctx.body = 'test find ' + ctx.request.href;
}
}
通过 fancy-decorator 插件的修饰器可以简化成(和 java 的 spring-boot 中使用类似 😀):
// controller/test.ts
// 如果你使用 RequestMapping 和 ResponseBody, router.js 中的路由配置可以直接省略。
import { Controller } from 'egg';
import {
RequestMapping,
ResponseBody,
RequestMethod,
RequestParam,
RequestQuery,
RequestBody,
} from 'egg-fancy-decorator';
export default class TestController extends Controller {
/**
* RequestMapping 简单的方式为方法直接定义个路由
* ResponseBody 可以简化返回的处理
*/
@RequestMapping('/api/project/list')
@ResponseBody
public async list(
@RequestParam('pageSize') pageSize: string,
@RequestParam('page') page: string,
@RequestParam({ value: 'pageSize', valueType: 'number' }) pageSizeNum: number, // 转换成number
@RequestQuery() query: any, // 获取所有的query参数
) {
const { ctx } = this;
console.log(query);
return await ctx.service.project.list({ pageSize, page });
}
/**
* 一个可以定义多个路由路径或请求的方式
* method的设置可省略,默认是get的方式
*/
@RequestMapping({ value: ['/api/project/find', '/api/project/find2'], method: RequestMethod.POST })
@ResponseBody
public find(@RequestParam('keyword') keyword: string, @RequestBody() body: any) {
console.log(keyword);
console.log('post body:', body);
const { ctx } = this;
return 'test find ' + ctx.request.href;
}
}
请到 config/config.default.js 查看详细配置项说明。
请到 issues 异步交流。