分针网—每日分享:express for node 路由route几种实现方式的思考

来源:互联网 发布:c# 自动抓取网页数据 编辑:程序博客网 时间:2024/05/19 03:26

http://www.f-z.cn/id/211

1、路由实现方式和顺序

express框架创建的模板app,js中默认代码
[javascript]
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'));
});

其中以下两句尤其重要,对路由产生影响
[javascript]
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,同时包含
[javascript]
app.get('/test.html', function(req, res) {
res.send('Hello from route handler');
});

方式1:

[javascript]
<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:

[javascript]
<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:


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

[javascript]
<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
[javascript]
var routes = require('./routes');
app.get('/',routes.index);

routes/index.js
[javascript]
exports.index=function(req,res){
res.render('index',{title:'Express'});
}

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

app.js
[javascript]
routes(app);//最佳
[javascript]
app.use(express.router(routes));


routes/index.js
[javascript]
module.exports = function(app){
app.get('/',function(req,res){
res.render('index', { title: 'Express' });
});
app.get('/reg', function(req, res) {
res.render('reg', {
title: '用戶註冊',
});
});
};




学习更多IT知识 加群:272292492





阅读全文
0 0