Skip to content
hefangshi edited this page Jun 5, 2015 · 2 revisions

yog2 框架在 express 的路由基础上,提供了自动路由与多级路由系统。目的是让 UI 层开发更高效、更规范的同时又能够保证最大的灵活性。

yog2 的路由分为两类。一类是根路由,其角色与传统的 Express 路由非常类似,是所有请求的一致入口,因此我们在根路由拥有最大的自由度,可以做任何转发。另一类是 app 路由,它只能接收根路由分发到各个 app 的请求,请求在 app 中如何分发则可以完全由 app 路由控制。

自动路由

基于 约定优于配置 的思想,我们提供了自动路由功能,目的是让开发者无需像 express 中一样手动注册路由,只需要在指定的目录按照指定的规则创建文件就可以创建一个 Web 服务。

路由规则

自动路由用于管理url与action之间的映射关系,默认的路由规则为

http://www.example.com/home/index => app/home/action/index.js

http://www.example.com/home/doc/detail => app/home/action/doc/detail.js

如果上述规则没有匹配成功,会尝试匹配同名文件夹下的index.js,即

http://www.example.com/home/index => app/home/action/index/index.js

http://www.example.com/home/doc/detail => app/home/action/doc/detail/index.js

从上述规则我们可以看出,自动路由会将网站第一级目录识别为 app 的名称,会根据这个名称寻找同名的 app 进行转发。而在 app 路由的处理过程中,会根据 action 文件夹下的目录结构进行进一步的转发。

通过上述自动路由规则,我们可以不编写任何路由代码,就组织出一个拥有多级目录的站点。

method 转发

同一个 action 文件一般只会对应一个 URL ,但是 yog2 提供了按照 HTTP METHOD 进行自动转发的能力,举例来说

//app/home/action/index.js

// GET /home/index
module.exports.get = function (req, res) {};

// POST /home/index
module.exports.post = function (req, res) {};

// PUT /home/index
module.exports.put = function (req, res) {};

// DELETE /home/index
module.exports.delete = function (req, res) {};

METHOD 名称均为小写

通过 METHOD 转发功能,我们可以为同一个 URL ,分别定义在不同 METHOD 请求下的行为。

此外,如果同时存在 module.exports 函数与 module.exports.$METHOD 函数,如

//app/home/action/index.js

module.exports = function (req, res, next) {
    req.user = req.session.user;
    next();
}

// GET /home/index
module.exports.get = function (req, res) {};

// POST /home/index
module.exports.post = function (req, res) {};

此时无论是 GET 请求还是 POST 请求,都会先经过 module.exports 函数处理后再进入各自的 METHOD 函数,因此我们可以将 module.exports 函数视为 URL 级别的通用处理逻辑。

路由扩展

除了自动路由外,总会存在一些 URL 设计是自动路由无法满足的,因此 yog2 框架也提供了极为灵活的路由扩展能力,你甚至可以通过路由扩展能力完全的屏蔽自动路由的功能。

root路由扩展

根路由 rootRouter 是用于管理 yog2 项目的根路由,通过扩展根路由,我们可以完全的控制请求入口。

rootRouter可以在 project目录中的 conf/plugins/dispatcher.js 中修改

router更多的使用方法可以参考 Express文档

可以为一个app设置一个别名

router.use('/custom', yog.dispatcher.router('home'))
// http://www.example.com/custom => app/home/index/index.js

可以直接建立一个特殊的URL

router.get('/somespecial', yog.dispatcher.action('home/doc/detail'))
// http://www.example.com/somespecial => app/home/doc/detail.js

也可以在此处将router当成app使用,加载任意中间件

router.use(function(req, res, next){
});

app路由扩展

appRouter 用于管理进入 app 后的请求分发,在这里你可以加载 app 级别的中间件或者通用逻辑,也可以用于实现自动路由无法满足的URL设计需求。

appRouter可以在 app 目录中的 server/router.js 中修改。

router更多的使用方法可以参考 Express文档

module.exports = function(router){
    // you can add app common logic here
    router.use(function(req, res, next){
    });

    // also you can add custom action
    // request /spa/some/hefangshi
    router.get('/some/:user', router.action('api'));
    
    // or write action directly
    router.get('/some/:user', function(res, req){});

    // a restful api example
    router.route('/book')
        // PUT /cdcd/book/id
        .put(router.action('book').put)
        // GET /cdcd/book
        .get(router.action('book'));

    router.route('/book/id/:id')
        // GET /cdcd/book/id
        .get(router.action('book').get)
        // DELETE /cdcd/book/id
        .delete(router.action('book').delete);
};
Clone this wiki locally