express for node 路由route几种实现方式的思考 .

1、路由实现方式和顺序

express框架创建的模板app,js中默认代码:

  1. var express = require('express');  
  2. var routes = require('./routes');  
  3. var user = require('./routes/user');  
  4. var http = require('http');  
  5. var path = require('path');  
  6.   
  7. var app = express();  
  8.   
  9. // all environments   
  10. app.set('port', process.env.PORT || 3000);  
  11. app.set('views', __dirname + '/views');  
  12. app.set('view engine', 'ejs');  
  13. app.use(express.favicon());  
  14. app.use(express.logger('dev'));  
  15. app.use(express.bodyParser());  
  16. app.use(express.methodOverride());  
  17. app.use(app.router);  
  18. app.use(express.static(path.join(__dirname, 'public')));  
  19.   
  20. // development only   
  21. if ('development' == app.get('env')) {  
  22.   app.use(express.errorHandler());  
  23. }  
  24.   
  25. app.get('/', routes.index);  
  26. app.get('/users', user.list);  
  27.   
  28. http.createServer(app).listen(app.get('port'), function(){  
  29.   console.log('Express server listening on port ' + app.get('port'));  
  30. });  

其中以下两句尤其重要,对路由产生影响:

  • app.use(app.router);  
  • app.use(express.static(path.join(__dirname, 'public')));

(1)express.static指定了静态页面的查找目录,如果定义express.static('/var/www'),当用户向node请求http://server/file.html,node将会自动查找http://server/file.html
(2)两句的前后顺序决定了当静态页面和动态路由都存在时,哪个决定node的真实路由

假设在静态目录下存在test.html,同时包含:

    app.get('/test.html', function(req, res) {  

           res.send('Hello from route handler');  }); 

方式1:

  • <SPAN style="FONT-FAMILY: Arial Black; FONT-SIZE: 14px">app.use(app.router);  
  • app.use(express.static(path.join(__dirname, 'public')));</SPAN>

则浏览器看到的结果是Hello from route handler

方式2:

 

  • <P><SPAN style="FONT-SIZE: 14px"><SPAN style="FONT-FAMILY: Arial Black"><STRONG>app.use(express.static(path.join(__dirname, 'public')));  
  • </STRONG></SPAN><SPAN style="FONT-FAMILY: Arial Black"><STRONG>app.use(app.router);</STRONG></SPAN></SPAN></P>

   则浏览器看到的结果是显示test.html内容

 

方式3:

 

  1. exports.index=function(req,res){  
  2.     res.render('index',{title:'Express'});  }  
  • <P><SPAN style="FONT-SIZE: 14px"><SPAN style="FONT-FAMILY: Arial Black"><STRONG>app.use(express.static(path.join(__dirname, 'public')));  
  • </STRONG></SPAN><SPAN style="FONT-FAMILY: Arial Black"><STRONG>//app.use(app.router);  //注释掉</STRONG></SPAN></SPAN></P>

同时删除test.html文件

则浏览器看到的结果是显示Hello from route handler,说明其实写不写这句,express都是会默认执行的

 

express官方推荐的是方式1的写法,之所以这样做,是考虑到性能问题,不论方式2或方式3,都要首先读写磁盘查找文件,没有匹配文件后然后找路由,而方式1,如果有匹配的路由,则不必去查找磁盘,磁盘的IO操作是必然费时效率低下的

 

2、第二种路由写法

上述的路由方式,都是写在app.js里,当路由的内容不断增加时,可读性变差

所以有了第二种写法:

 

app.js

  • var routes = require('./routes');  
  • app.get('/',routes.index); 

routes/index.js

  • exports.index=function(req,res){  
  •     res.render('index',{title:'Express'});  

3、第三种路由写法(最佳)

app.js  
routes(app); //最佳 
app.use(express.router(routes));
 
routes/index.js
  • module.exports = function(app){  
  •   app.get('/',function(req,res){  
  •     res.render('index', { title: 'Express' });  
  •   });  
  •   app.get('/reg', function(req, res) {  
  •     res.render('reg', {  
  •       title: '用戶註冊',  
  •     });  
  •   });  
  • }; 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/mfbxy/p/4460524.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值