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

【PS:文末有本人联系方式,欢迎技术交流~】

egg-shell-decorators 是一个 Egg.js 的插件,它提供了一系列的 Decorator 装饰 Controller,让我们先来看一个例子:

// 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 里我们就可以知道每一个函数对应的请求信息。

也许你会疑惑上面的@Message还有为什么直接把查询到的数据 return 了是怎么回事,现在我将系统的向你介绍该插件的使用:

Installation

$ npm install egg-shell-decorators -S
复制代码

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

$ npm install babel-register babel-plugin-transform-decorators-legacy -D
复制代码

Usage

示范代码均采用 TypeScript

// app/router.ts
import { Application } from 'egg';
import { EggShell } from 'egg-shell-decorators';export default (app: Application) => {EggShell(app, { prefix: '/', quickStart: true });
};
复制代码

配置参数:

prefix: string // 全局前缀
quickStart: boolean // 开启QuickStart
复制代码

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

// app.js
'use strict';
require('babel-register')({plugins: ['transform-decorators-legacy',],
});
复制代码

Specialty

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

  • 文件路径:app/controller/home.ts

    • @Get('/detail/:id')
    • @Post('/')
  • 解析路由:
    • [get] 全局前缀 + /home + /detail/:id
    • [post] 全局前缀 + /home + /

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

Member

  • Http相关

    • ✅Get
    • ✅Post
    • ✅Put
    • ✅Delete
    • ✅Patch
    • ✅Options
    • ✅Head
    • ?Header
  • 中间件相关
    • ✅Before
    • ✅After
    • ✅BeforeAll
    • ✅AfterAll
  • Swagger相关
    • ?敬请期待下一个版本
  • 其他
    • ✅Prefix
    • ✅Message
    • ✅IgnoreJwt
    • ✅IgnoreJwtAll

Prefix

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

// 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

QuickStart

在 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 的第二个参数默认值为500throw StatusError('权限不足', 403)}}
复制代码

RESTful

让我们用 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

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';}}
复制代码

MiddleWare

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 => 1before middleware => 2before middleware => 3before middleware => 4主业务...after middleware => 1after middleware => 2after middleware => 3after middleware => 4*/@Before([ Before3, Before4 ])@After([ After3, After4 ])@Get('/')public async index() {return 'hi, egg';}}
复制代码

egg-shell-decorators 的用法都已经介绍完毕了,如果你是一名 Noder 或者热爱 Egg.js 的小伙伴,那么可以加我微信进行技术交流,让我们一起变得更优秀:

egg-shell-decorators 给你的蛋蛋加个壳相关推荐

  1. Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制

    使用shell脚本实现USB设备的加载与文件复制 在Linux操作系统中,如果插入一个USB设备,需要用mount挂载命令才能实现这个设备的加载,下面写一个USB设备挂载与文件复制的Shell程序,程 ...

  2. 易语言软件加VMProtect壳的正确方法

    https://www.cnblogs.com/fox2013/p/4553977.html VMP是一款很强大的加密壳,代码虚拟化技术可以很好的保护程序不被恶意修改破J但是很多人不知道怎么给自己的程 ...

  3. Android安全讲座第七层 [一] 破解加过壳的APK应用

    android应用中的apk的安全问题一直遭人诟病,各种破解,各种汉化,并且有了ida pro这样的逆天工具,对于android应用的破解简直就是小儿科了.但是事物都是两方面的,有矛就有盾,逐渐的ap ...

  4. shell脚本中变量一定要加双引号

    重要的事情说三遍     摘自  https://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/index.html 字符串比较说明 大多 ...

  5. shell 脚本中如何实现自加操作

    i=1 i=`expr $i + 1` 两边符号为~键 中的符号 转载于:https://blog.51cto.com/sharelife/1081570

  6. shell中用while循环实现连加操作

    #!/bin/bash read COUNT a=1 add=0 while [ $a -le $COUNT ] do add=`expr $add + $a` a=`expr $a + 1` don ...

  7. shell脚本for循环从1加到100

    [root@node1 ~]# vim add.sh[root@node1 ~]# cat add.sh#1/bin/bash#求从1到100的和for i in {1..100}docount=$( ...

  8. 给大家分享一个简单的例子 给SWF加一个壳

    //今天给发家分享下 一个简单的给SWF加壳处理,用到的类是Loader package {//我有一点不明白哦,明明可以用Loader来动态的加载SWF 为什么很多人喜欢用loadMovie 有懂的 ...

  9. 加Zprotect壳解析

    Zprotect是新一代的软件加密保护壳,拥有多项独创的新颖技术,保护后的文件极度复杂,让破解变成一种高成本的体力劳动. Zprotect 支持多种类型的文件格式: 名称 后缀名 Win32 可执行文 ...

最新文章

  1. 心理所发表关于神经科学研究可信度的评论文章
  2. 办公室,手机上网不用愁
  3. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170401
  4. delphi如何让程序最小化到任务栏(使用Shell_NotifyIcon API函数)
  5. Fiori Elements - get annotation implementation in backend
  6. Python-PIL
  7. constraintlayout_androidApi:ConstraintLayout
  8. oracle表修改语句,Oracle的常用修改表及字段的语句
  9. Oracle 扩展sysaux,oracle 清理SYSAUX表空间
  10. sql server 当月天数
  11. Activity传递数据
  12. Linux下的tar命令
  13. 教育平台在线,教育平台源码 类似eduline教育平台系统源码下载
  14. 用云计算机,云计算在生活中的应用
  15. SecureCRT http代理设置
  16. [强网杯 2019]随便注
  17. 第13节 IIS之WEB服务器—用于发布网站
  18. VMware Workstation 15 Pro 安装centos7
  19. java读取execle
  20. 爬虫Scrapy框架学习(五)-东莞阳光热线问政平台爬取案例

热门文章

  1. 利用PIL库创建空白图像
  2. Ogre3D基础教程一
  3. 第2关:求2个数的和
  4. 交直流线性电源行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  5. seq和ack的理解
  6. python vbs_vbs和python
  7. [博学谷学习记录]超强总结,用心分享|人工智能机械学习基础知识KMeans总结分享
  8. 初学者怎么学习Java
  9. 网易免费企业邮箱配置客户端
  10. 2022渗透测试-文件上传漏洞的详细讲解