Skip to content
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 的路由

特别的,对于 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());
};
Clone this wiki locally