使用koa和koa-decorator-router实现装饰器路由

  • 在使用python的flask框架开发web应用时发现使用装饰器控制路由真的很好用,这样的写法看起来比较直观
@web.route('/register') def register(): pass@web.route('/login') def login(): pass@web.route('/save') @auth def save(): pass

下面来看下在nodejs里使用koa-decorator-router实现装饰器路由
  • 首先安装 npm i koa koa-router koa-decorator-router
  • 由于nodejs目前 还不支持装饰器的写法,所以需要配置babel,.babelrc配置如下,所以还需安装npm i babel-cli babel-core babel-plugin-transform-decorators-legacy babel-polyfill babel-preset-env babel-preset-stage-0 -D
{ "presets": ["env","stage-0"], "plugins": ["transform-decorators-legacy"] }

  • 新建一个入口文件,引入项目的入口文件app.js
require('babel-core/register')() require('babel-polyfill') require('./server/app.js')

  • app.js示例代码如下
import Route, { post, put, del, get, controller, convert, required } from 'koa-decorator-router' import Koa from 'koa' import Router from 'koa-router' import bodyParser from 'koa-bodyparser'const app = new Koa() const router = new Router() const route = new Route()app.use(bodyParser())const middleware1 = convert(async (ctx, next) => { console.log("middleware1") await next() })@controller('/article') class Article {@get('/detail/:id') @middleware1 getDetail(ctx) { ctx.body = `detail ${ctx.params.id}` }@put('/add') addArticle(ctx) { ctx.body = 'add' }@post('/post') @required({ body: ['id', 'name'] }) updateArticle(ctx) { ctx.body = 'post' }@del('/del') delArticle(ctx) { ctx.body = 'del' } }route.init(router) app .use(router.routes()) .use(router.allowedMethods()) app.listen(3000)

  • koa-decorator-router里面包含了get、post、del、put、controller、 convert方法和一个Route类。
    • 其中controller是为了修饰类,接收一个参数url。所修饰的类下面的所有请求地址都应加上这个url。如上面代码所示,请求地址就为/article/**
    • get、post、del、put就是请求方式,为了修饰类下面的方法
    • convert方法接收一个函数,将接收的函数转化成中间键。当使用中间键是需要使用convert方法转化下,因为直接写成装饰器,因为它不知道装饰器上方法是个中间键,如上面代码所示middleware1方法
    • required这个方法支持一些简单的参数校验。它接收一个对象参数,里面的键可以为bodyparamsquery,键值是必传参数组成的数组。如上面代码所示,/post接口的必传参数是idname。参数校验只支持一级,需更复杂的校验时,需要自己写中间键进行校验。
  • Route
    • init 接收一个参数,就是实例化的路由。这里需要注意是,在调用init方法要放在所有声明装饰器类的后面执行,因为这步是将装饰器路由上的所有方法挂载到路由上去
    • setRouterPath 设置导入路由文件夹的位置,并导入文件
    • setRouterPathAndInit导入路由文件,完成后自动初始化
route.setRouterPathAndInit(path.resolve(__dirname, './routes'), router) app .use(router.routes()) .use(router.allowedMethods()) app.listen(3000)

【使用koa和koa-decorator-router实现装饰器路由】or
async function start(){ await route.setRouterPath(path.resolve(__dirname, './routes')) route.init(router) app .use(router.routes()) .use(router.allowedMethods()) app.listen(3000) } start()

    推荐阅读