Express中server和路由分离
当我新建一个express配置的应用时,会自动创建一套应用构架:
其中:
public放置静态的东西,css、image、js
routes放置路由
views放置模板
看一下appjs
var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var app = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('your secret here')); app.use(express.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); app.configure('development', function(){ app.use(express.errorHandler()); }); app.get('/', routes.index); app.get('/users', user.list); http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); });
如果应用多了配置也会很多,app.js就会显得很臃肿。当然需要routes和app.js分离。
app.get('/', routes.index); app.get('/users', user.list); //app.get('/users/*', user.any); app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){ res.send(req.params); }); app.get('/form', function(req, res){ res.render('form'); }); app.post('/formaction',function(req, res){ console.dir(req.body); res.redirect('back'); }); app.put('/formaction',function(req, res){ console.dir(req.body); res.redirect('back'); });
方法是这样:
app.js
这样写,取代原来的routes配置:
routes(app);//这里执行
routes里这样写
module.exports=function(app){ app.get('/',function(req,res){ res.render('index',{ title:'首页' }); }); //.......其它配置 };
当然,其它模块路由可以分开写
users模块路由,可以写入routes下的users.js,内容:
/* * GET users listing. */ module.exports = function(app){ app.get('/users', function(req, res){ res.send("respond with a resource"); }); app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){ res.send(req.params); }); };
app.js里可以这样调用
//...... var users = require("./routes/users"); users(app); //......
当然这样如果模块多了,同样会造成app.js臃肿。
还有一种写法,就是在第一种方法的基础上修改,我们注意到var routes = require("./routes");默认引用的是routes下的index.js模块。可以以此做为全部路由的引用入口:
var users = require("./users"), form = require("./form"); module.exports = function(app){ users(app); form(app); }
app.js中修改如下
var routes = require("./routes");
routes(app); // users路由 //users(app); // form路由 //form(app);