资源分离技巧

一个返回 user 页 数据的例子:

路由文件 router/user.js

var router = require("express").Router();

router.get("/",function(req,res){
    res.locals.user = {
        name : 'leo',
        age:22
    }
    res.locals.page = {
        title : "jsera.net 专注于HTML5 & Node.js技术推广与应用"
    }
    res.render("user");
})

module.exports = router;

server.js

var express = require('express');
var path = require("path");

var app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use("/user",require("./router/user"));

app.listen(3000);

jade 模版文件views/user.jade

doctype html
html
  head
    title= title
  body
    p name is #{user.name}
    p age is #{user.age}

这里只是个例子,感觉很简单,我们回头看一下router/user.js会发现它的数据和路由是合在一起的,例子很简单,感觉不出缺点,下面的伪代码,让我们深刻感受到混乱:

var router = require("express").Router();

router.get("/",function(req,res){
    db("user1",function(u1){

        res.locals.user1 = u1;
        db("user2",function(u2){

            res.locals.user2 = u2;
            db("user3",function(u3){

                res.locals.user3 = u3;
                db("user4",function(u4){

                    res.locals.user4 = u4;

                    res.render("user");
                })
            })
        })
    })
})

module.exports = router;

数据和路由功能合在一起后,造成混乱的局面,下面是修改后的代码:

router.get("/",user1,user2,user3,user4,function(req,res){
    res.render("user");
})

这样就清爽多了,其中user1代码:

function user1(req,res,next){
   db("user4",function(u4){
           res.locals.user4 = u4;
           next();
   })
}

以上是伪代码,下面我们把 路由文件 router/user.js 做一下修改:

var router = require("express").Router();

function page(req,res,next){
    res.locals.page = {
        title : "jsera.net 专注于HTML5 & Node.js技术推广与应用"
    }
    next();
}

function user(req,res,next){
    res.locals.user = {
        name : 'leo',
        age:22
    }
    next();
}

router.get("/",page,user,function(req,res){
    res.render("user");
})

module.exports = router;

不要极端

上述代码,感觉路由器本身就是一行渲染代码res.render,其实这里可以是一个 action 或叫 controller ,所以逻辑代码可以放在这里,下面的伪代码说明如何掌握这个度:

var router = require("express").Router();

router.get("/",page,user,function action(req,res){

    if(locals.user.name === "leo"){
        locals.user.admin = true;
    }else{
        locals.user.admin = false;
    }

    if(locals.user.age > 18){
        locals.user.adults = true;
    }

    res.render("user");
})

module.exports = router;

上面代码说明了,逻辑代码要放在路由器当中,进入路由器之前的 验证数据 需要和路由器分离。(这么说有些武断,我认为这种分离是最合理的,并不是强制一定要这样,可根据自己的理解对这种分离技巧,进行优化)。