Egg.js 路由装饰器,让你的开发更敏捷~
【PS:文末有本人联系方式,欢迎技术交流~】javascript
egg-shell-decorators 是一个 Egg.js 的插件,它提供了一系列的 Decorator 装饰 Controller,让咱们先来看一个例子:java
// app/controller/user import { Controller } from 'egg'; import { Get, Message } from 'egg-shell-decorators'; export default class UserController extends Controller { @Get('/detail/:id') @Message('so great !') public async get({ params: { id } }) { return await this.service.user.getById(id) } }
上面是一个简单的控制器例子,若是是 egg.js 的默认开发方式,那么你得在 router 文件对相应的路由进行映射,而使用 egg-shell-decorators 以后,不再用在 router 文件进行任何路由匹配了。由于 egg-shell-decorators 的路由解析
会自动对路由进行解析,像上面这个例子会自动解析成 [get] 全局前缀 + /user/detail/:id
,这样咱们开发者就不用再去操心映射的问题了,并且在 Controller 里咱们就能够知道每个函数对应的请求信息。git
也许你会疑惑上面的@Message
还有为何直接把查询到的数据 return 了
是怎么回事,如今我将系统的向你介绍该插件的使用:github
$ npm install egg-shell-decorators -S
若是不是采用 TypeScript 脚手架,则需执行如下脚本安装相关的 Babel 插件:typescript
$ npm install babel-register babel-plugin-transform-decorators-legacy -D
示范代码均采用 TypeScript
// app/router.ts import { Application } from 'egg'; import { EggShell } from 'egg-shell-decorators'; export default (app: Application) => { EggShell(app, { prefix: '/', quickStart: true }); };
配置参数:shell
prefix: string // 全局前缀 quickStart: boolean // 开启QuickStart
若是不是采用 TypeScript 脚手架,则需在入口注册 Bable 插件使其支持 Decorator:npm
// app.js 'use strict'; require('babel-register')({ plugins: [ 'transform-decorators-legacy', ], });
路由解析
是 egg-shell-decorators 最大的特色,使用 Decorator 装饰的路由,则会被自动解析成对应的路由:微信
文件路径:app/controller/home.ts
babel
解析路由:app
[get] 全局前缀 + /home + /detail/:id
[post] 全局前缀 + /home + /
这里的 全局前缀 指的是你在 EggShell 里配置的 prefix
,路由解析支持多层级解析噢
~
Http相关
中间件相关
Swagger相关
其余
若是你不喜欢路由解析
给你的路径,那么你能够自定义解析的路径:
// app/controller/user import { Controller } from 'egg'; import { Get, Message, Prefix } from 'egg-shell-decorators'; @Prefix('/super2god') export default class UserController extends Controller { @Get('/detail/:id') @Message('so great !') public async get({ params: { id } }) { return await this.service.user.getById(id) } }
这样解析出来的路由就是:全局前缀 + /super2god/detail/:id
,而不是全局前缀 + /user/detail/:id
在 EggShell 里配置 quickStart
为 true 便可开启 QuickStart 模式,QuickStart 模式会自动处理响应体:
import { Controller } from 'egg'; import { Get, Message, Error, StatusError } from 'egg-shell-decorators'; export default class UserController extends Controller { /** status: 200 { success: true, message: '棒棒哒', data: { id: '123', name: 'super2god' }, } */ @Get('/:id') @Message('棒棒哒') public async get({ params: { id } }) { return await this.service.user.getById(id) } /** status: 200 { success: false, message: '故意的' } */ @Post('/:id') public post() { throw Error('故意的') } /** status: 403 { success: false, message: '权限不足' } */ @Post('/:id') public post() { // StatusError 的第二个参数默认值为500 throw StatusError('权限不足', 403) } }
让咱们用 egg-shell-decorators 快速写一套 RESTful 风格的接口(QuickStart 模式):
import { Controller } from 'egg'; import { Get, Post, Put, Delete } from 'egg-shell-decorators'; export default class SubOrderController extends Controller { @Get('/:id') public get({ params: { id }, query: { keyword } }) { return `resuful get : ${id}, ${keyword}`; } @Post('/:id') public post({ params: { id }, request: { body: { keyword } } }) { return `resuful post : ${id}, ${keyword}`; } @Put('/:id') public put({ params: { id }, request: { body: { keyword } } }) { return `resuful put : ${id}, ${keyword}`; } @Delete('/:id') public delete({ params: { id }, request: { body: { keyword } } }) { return `resuful delete : ${id}, ${keyword}`; } }
因为 egg-shell-decorators 内置把 ctx
对象传进 Controller 的函数里了,因此咱们直接结构就能够获取到请求参数了,美滋滋~
固然,除了这四个经常使用的请求方法,egg-shell-decorators 还提供了其余比较经常使用的请求方法,具体请看上面的Http请求方法
。
Jwt是目前比较流行的身份认证机制,因此 egg-shell-decorators 提供了相关的 Decorator。若是你使用了 egg-jwt
,那默认因此路由都须要进行身份校验,而有时咱们想让部分路由不用校验,那么你只需那么作:
import { Controller } from 'egg'; import { Get, IgnoreJwt } from 'egg-shell-decorators'; export default class HomeController extends Controller { @IgnoreJwt @Get('/') public async index() { return 'hi, egg'; } }
是否是很简单呢,若是你想对整个 Controller 都进行校验忽略,那也很简单:
import { Controller } from 'egg'; import { Get, Post, IgnoreJwtAll } from 'egg-shell-decorators'; @IgnoreJwtAll export default class HomeController extends Controller { @Get('/') public async get() { return 'get'; } @Post('/') public async post() { return 'post'; } }
egg-shell-decorators 提供了四个中间件相关的 Decorator,让你使用中间件更简单:
import { Controller } from 'egg'; import { Get, IgnoreJwtAll, Before, After, BeforeAll, AfterAll } from 'egg-shell-decorators'; const Before1 = require('egg-shell-decorators/test/middlewares/before-1'); const Before2 = require('egg-shell-decorators/test/middlewares/before-2'); const Before3 = require('egg-shell-decorators/test/middlewares/before-3'); const Before4 = require('egg-shell-decorators/test/middlewares/before-4'); const After1 = require('egg-shell-decorators/test/middlewares/after-1'); const After2 = require('egg-shell-decorators/test/middlewares/after-2'); const After3 = require('egg-shell-decorators/test/middlewares/after-3'); const After4 = require('egg-shell-decorators/test/middlewares/after-4'); @BeforeAll([ Before1, Before2 ]) @AfterAll([ After1, After2 ]) @IgnoreJwtAll export default class HomeController extends Controller { /** before middleware => 1 before middleware => 2 before middleware => 3 before middleware => 4 主业务... after middleware => 1 after middleware => 2 after middleware => 3 after middleware => 4 */ @Before([ Before3, Before4 ]) @After([ After3, After4 ]) @Get('/') public async index() { return 'hi, egg'; } }
egg-shell-decorators 的用法都已经介绍完毕了,若是你是一名 Noder 或者热爱 Egg.js 的小伙伴,那么能够加我微信进行技术交流,让咱们一块儿变得更优秀: