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

express for node 路由route几种实现方式的思考的更多相关文章

  1. xpress for node 路由route几种实现方式

    路由实现方式和顺序第二种路由写法第三种路由写法最佳 http://blog.csdn.net/mociml/article/details/11137571# http://blog.fens.me/ ...

  2. 使用express创建node服务器的两种方法及区别

    使用express创建node服务器有两种方法,如下所示: 方法一: var express = require('express'); var app = express(); app.listen ...

  3. .NetCore中三种注入方式的思考

    该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...

  4. SPA中,Node路由优先级高于React路由

    一.问题描述 在一场面试中,面试官问到了React和Node路由之间的关系. 现在SPA(单页面应用)的使用越来越广. Node(后台)和React(前端)都有自己的路由,当我页面访问一个URL的时候 ...

  5. express-18 路由

    简介 路由是网站或Web服务中最重要的一个方面:路由是将请求(由URL和HTTP方法指定)路由到处理它们的代码去的一种机制. 路由过去是基于文件的,这很简单,但不灵活. IA 是指内容的概念性组织.在 ...

  6. 在ASP.NET Core中构建路由的5种方法

    原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...

  7. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  8. 前端框架(kraken、Express、Node、MVC)

    You know my loneliness is only kept for you, my sweet songs are only sang for you. 前端框架相关知识记录. krake ...

  9. Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由Route&Navigation

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

随机推荐

  1. 高质量程序设计指南C/C++语言——C++/C程序设计入门

    1.在C++/C中,全局变量(extern或static)存放在程序的静态数据区中,在程序进入main()之前创建,在main()结束之后销毁,因此在我们的代码中根本没有机会初始化它们,于是语言及其实 ...

  2. Spring Boot 探索系列 - 自动化配置篇

    26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging f ...

  3. line-height具体解释

    章:浏览器与Hack].7.3.5 应用:单行文字在垂直方向居中在网页设计中,往往为了突出标题而加入背景图案.如图7-31所看到的. watermark/2/text/aHR0cDovL2Jsb2cu ...

  4. 使用Visual Studio将Objective-C编译C++

    编译器支持 谷歌和苹果应用Clang由于他们的C++前端.为了使他们的执行代码Windows上,微软不得不Visual C++C2和Clang结合起来. (Clang是一个C语言.C++.Object ...

  5. SimpleDateFormat使用具体解释

      public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...

  6. BZOJ 4143: [AMPPZ2014]The Lawyer( sort )

    水题... 排序搞出每天的会议有哪些, 然后再按照会议的开始时间和结束时间排序, 最晚开始的和最早结束的会议不是同一场而且最晚开始的时间>最早结束的会议就有可能方案 -------------- ...

  7. Hadoop在Windows下的安装配置

    由于本人近期近期一段时间 都在学习Hadoop,接触了比較多的理论,可是想要深入的去学习Hadoop整个平台,那就必须实战的训练,首先第一步,当然是先搭建好一个Hadoop平台为先.可是比較坑爹的是. ...

  8. SQL 教程

    SQL 教程 http://www.w3school.com.cn/sql/

  9. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  10. Win32 进程间通信的分析与比较(13种方法)

    1 进程与进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线 程是Windows操作系统的一个基本特征.M ...