-
Notifications
You must be signed in to change notification settings - Fork 17
路由处理
Xu,Yizhi edited this page Jul 14, 2015
·
14 revisions
lark.js 的路由和 ror/odp 等框架的 controller/action 类似,但更简单。lark.js 将 controller和action合二为一,通过文件存放路径映射 url 路径,减少复杂度。
例如对于 web 页面的路由,可以写成类似于php
的基于目录和文件名的路由形式。lark-router会将url对应的path分派到这个文件来处理,比如下面的路由:
/book/list?id=123
你只需在 controllers 目录下新建 book 目录,在book目录下新建 list.js, 在list.js中写如下代码来处理url对应的业务逻辑:
module.exports = function(router){
router.get('/', function *(next){
var id = this.request.id
// do something
})
}
更多的例子:
controllers/index.js ===> GET /
controllers/demo.js ===> GET /demo
controllers/hello/world.js ===> GET /hello/world
controllers/demo/index.js ===> GET /demo
使用如下方式匹配url参数:
router.get('/hello/:name', function * (next) { // ===> GET /hello/{name} {name}是不含'/'的字符串
var name = this.params.name;
});
输入'http://localhost:3000/hello/world',该代码中的'name'会得到 world的值
router.get('/foo/:bar*', function * (next) { // ===> GET /foo/{bar} {bar}是/foo/之后的全部字符串
var bar = this.params.bar;
});
输入url路径'http://localhost:3000/hello/world/again',该代码中的'name'会得到 'world/again'的值
特别的,对于 restful api 的路由,要设置路由的METHOD,可以写成如下形式:
router
.get('/', function *(next) { // ===> GET /?...
this.body = 'Hello World!';
})
.post('/', function *(next) { // ===> POST /?...
// ...
})
.put('/', function *(next) { // ===> PUT /?...
// ...
})
.del('/', function *(next) { // ===> DELETE /?...
// ...
});
除了lark自动加载的路由外,用户还可以在controller中自定义路由。
首先引用原生的koa-router,创建原生路由对象。
var Router = require('koa-router');
var _router = new Router();
之后添加路由规则。
_router.get('/xxx', function * () {
yield next
})
最后通过app.use
注册到系统中。由于controller在执行时的上下文绑定了app
,所以可以通过this.use
调用。
this.use(_router.routes());
完整示例:
var Router = require('koa-router');
module.export = function (router) {
var _router = new Router();
_router.get('/xxx', function * () {
yield next
})
this.use(_router.routes());
};