Nodejs路由实现方式和顺序

1、路由实现方式和顺序

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

var express = require('express');  
var routes = require('./routes');  
var user = require('./routes/user');  
var http = require('http');  
var path = require('path');  
  
var app = express();  
  
// all environments  
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(app.router);  
app.use(express.static(path.join(__dirname, 'public')));  
  
// development only  
if ('development' == app.get('env')) {  
  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.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:

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

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


方式2:

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

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


方式3:

exports.index=function(req,res){  
    res.render('index',{title:'Express'});  
}  
app.use(express.static(path.join(__dirname, 'public')));  
app.use(app.router);


同时删除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: '用戶註冊',  
    });  
  });  
};



参考http://stackoverflow.com/questions/12695591/node-js-express-js-how-does-app-router-work


修改时间 2017-06-13

真诚赞赏,手留余香
赞赏
随机推荐
软件发布版本区别介绍-Alpha,Beta,RC,Release
Windows下,Apache防止ddos攻击,安装配置mod_evasive模块
MySQL备份与恢复,mysqldump命令导入导出数据库
composer 把默认镜像修改成阿里云镜像
iOS 10 APP调用摄像头导致的crash
修改macOS自带的PHP版本
隐藏overflow:scroll带来的滚动条
为什么Axios ajax每次patch都会有两次网络请求?
Node.js i18n 国际化实现语言切换
nginx 的过时模式 TLS 1.0 或 TLS 1.1 被起用,无法禁止的解决办法