使用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實現裝飾器路由javascript

  • 首先安裝 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類。java

    • 其中controller是爲了修飾類,接收一個參數url。所修飾的類下面的全部請求地址都應加上這個url。如上面代碼所示,請求地址就爲/article/**
    • get、post、del、put就是請求方式,爲了修飾類下面的方法
    • convert方法接收一個函數,將接收的函數轉化成中間鍵。當使用中間鍵是須要使用convert方法轉化下,由於直接寫成裝飾器,由於它不知道裝飾器上方法是個中間鍵,如上面代碼所示middleware1方法
    • required這個方法支持一些簡單的參數校驗。它接收一個對象參數,裏面的鍵能夠爲bodyparamsquery,鍵值是必傳參數組成的數組。如上面代碼所示,/post接口的必傳參數是idname。參數校驗只支持一級,需更復雜的校驗時,須要本身寫中間鍵進行校驗。
  • Routenode

    • init 接收一個參數,就是實例化的路由。這裏須要注意是,在調用init方法要放在全部聲明裝飾器類的後面執行,由於這步是將裝飾器路由上的全部方法掛載到路由上去
    • setRouterPath 設置導入路由文件夾的位置,並導入文件
    • setRouterPathAndInit導入路由文件,完成後自動初始化
route.setRouterPathAndInit(path.resolve(__dirname, './routes'), router)
    app
      .use(router.routes())
      .use(router.allowedMethods())
    app.listen(3000)
複製代碼
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()
複製代碼
相關文章
相關標籤/搜索