首页

egg-shell-decorators.png

v1.6.0 - 图2v1.6.0 - 图3

Egg.js 路由装饰器,让你的开发更敏捷~

路由解析egg-shell-decorators(蛋壳) 最大的特点,使用 Decorator 装饰的路由,则会被自动解析成对应的路由:

  • 文件路径:
    • app/controller/home.ts
      • @Get('/detail/:id')
      • @Post('/')
  • 解析路由:
    • [get] /home + /detail/:id
    • [post] /home + /

这里的 全局前缀 指的是你在 EggShell 里配置的 prefix,路由解析支持多层级解析噢~

示范代码均采用 TypeScript。(右边的菜单可以滚动的噢)

使用前必看

新增的内容会用黄色高亮,删除的内容会用红色高亮。

配置

原配置全部删除,所以使用了以下参数的同学要记得自己兼容处理一下,QuickStart模式也取消了。

  1. {
  2. "prefix": "string", // 全局前缀
  3. "quickStart": "boolean", // 开启QuickStart模式
  4. "before": "Function[]", // 全局前置中间件
  5. "after": "Function[]", // 全局后置中间件
  6. "swaggerOpt": "object" // 具体配置查看 Example > Swagger Ui > swaggerOpt
  7. }

快速开始

咱们先快速来一个例子:

  1. import { Controller } from 'egg';
  2. import { Get, Post } from 'egg-shell-decorators';
  3. export default class UserController extends Controller {
  4. @Get('/:id')
  5. public getUser({ params: { id } }) {
  6. this.ctx.body = `getUser:${id}`;
  7. }
  8. @Post('/')
  9. public createUser({ request: { body: { name, phone, age } } }) {
  10. this.ctx.body = { name, phone, age };
  11. }
  12. }

由于蛋壳内置把 ctx 对象传进 Controller 的函数里了,所以我们直接结构就可以获取到请求参数了,美滋滋~

安装

  1. $ npm install egg-shell-decorators -S

如果不是采用 TypeScript 脚手架,则需执行以下脚本安装相关的 Babel 插件:

  1. $ npm install babel-register babel-plugin-transform-decorators-legacy -D

使用

  1. // app/router.ts
  2. import { Application } from 'egg';
  3. import { EggShell } from 'egg-shell-decorators';
  4. export default (app: Application) => {
  5. EggShell(app);
  6. };

如果不是采用 TypeScript 脚手架,则需在入口注册 Bable 插件使其支持 Decorator:

  1. // app.js
  2. 'use strict';
  3. require('babel-register')({
  4. plugins: [
  5. 'transform-decorators-legacy',
  6. ],
  7. });

装饰器

Method代表装饰的是 Controller 里的函数,而Controller则是装饰控制器的。

Http相关

  • Method
    • Get (string)
      • 路由路径
    • Post (string)
      • 路由路径
    • Put (string)
      • 路由路径
    • Delete (string)
      • 路由路径
    • Patch (string)
      • 路由路径
    • Options (string)
      • 路由路径
    • Head (string)
      • 路由路径
    • All (string)
      • 路由路径

其他

  • EggShell(app: Application, option: object) (非装饰器)
    • 核心对象
  • Method
    • Middleware (Function[])
      • 中间件
  • Controller
    • Prefix
      • 路由的前缀,用于取缔路由解析给的前缀(prefix)

案例

egg-shell-example 蛋壳示例代码,该仓库提供了一套简单的蛋壳示例代码,有疑惑的小伙伴可以下载取之。 该代码暂未更新到最新版本。

自定义路由前缀

如果你不喜欢路由解析给你的路径,那么你可以自定义解析的路径:

  1. // app/controller/user.ts
  2. import { Controller } from 'egg';
  3. import { Get, Prefix } from 'egg-shell-decorators';
  4. @Prefix('/super2god')
  5. export default class UserController extends Controller {
  6. @Get('/detail/:id')
  7. @Message('so great !')
  8. public async get({ params: { id } }) {
  9. this.ctx.body = await this.service.user.getById(id)
  10. }
  11. }

这样解析出来的路由就是:全局前缀 + /super2god/detail/:id,而不是全局前缀 + /user/detail/:id

RESTful

让我们用蛋壳快速写一套 RESTful 风格的接口(QuickStart 模式):

  1. import { Controller } from 'egg';
  2. import { Get, Post, Put, Delete } from 'egg-shell-decorators';
  3. export default class SubOrderController extends Controller {
  4. @Get('/:id')
  5. public get({ params: { id }, query: { keyword } }) {
  6. this.ctx.body = `resuful get : ${id}, ${keyword}`;
  7. }
  8. @Post('/:id')
  9. public post({ params: { id }, request: { body: { keyword } } }) {
  10. this.ctx.body = `resuful post : ${id}, ${keyword}`;
  11. }
  12. @Put('/:id')
  13. public put({ params: { id }, request: { body: { keyword } } }) {
  14. this.ctx.body = `resuful put : ${id}, ${keyword}`;
  15. }
  16. @Delete('/:id')
  17. public delete({ params: { id }, request: { body: { keyword } } }) {
  18. this.ctx.body = `resuful delete : ${id}, ${keyword}`;
  19. }
  20. }

当然,除了这四个常用的请求方法,蛋壳还提供了其他比较常用的请求方法,具体请看上面的Member > Http相关

中间件

蛋壳提供了中间件相关的装饰器,让你使用中间件更简单:

  1. import { Controller } from 'egg';
  2. import { Get, Middleware } from 'egg-shell-decorators';
  3. import Middleware01 from '../middleware/middleware-01';
  4. import Middleware02 from '../middleware/middleware-02';
  5. import Middleware03 from '../middleware/middleware-03';
  6. export default class UserController extends Controller {
  7. @Get('/')
  8. @Middleware([ Middleware01(), Middleware02(), Middleware03() ])
  9. public getUser() {
  10. this.ctx.body = { name: 'super2god' };
  11. }
  12. }

技术交♂流

有啥技术问题可以加我微信~

image.png