使用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
这个方法支持一些简单的参数校验。它接收一个对象参数,里面的键可以为body
、params
和query
,键值是必传参数组成的数组。如上面代码所示,/post
接口的必传参数是id
和name
。参数校验只支持一级,需更复杂的校验时,需要自己写中间键进行校验。
- 其中
- 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()
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 由浅入深理解AOP
- 前任
- 【译】20个更有效地使用谷歌搜索的技巧