express for node 路由route几种实现方式的思考
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、第三种路由写法(最佳)
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几种实现方式的思考的更多相关文章
- xpress for node 路由route几种实现方式
路由实现方式和顺序第二种路由写法第三种路由写法最佳 http://blog.csdn.net/mociml/article/details/11137571# http://blog.fens.me/ ...
- 使用express创建node服务器的两种方法及区别
使用express创建node服务器有两种方法,如下所示: 方法一: var express = require('express'); var app = express(); app.listen ...
- .NetCore中三种注入方式的思考
该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...
- SPA中,Node路由优先级高于React路由
一.问题描述 在一场面试中,面试官问到了React和Node路由之间的关系. 现在SPA(单页面应用)的使用越来越广. Node(后台)和React(前端)都有自己的路由,当我页面访问一个URL的时候 ...
- express-18 路由
简介 路由是网站或Web服务中最重要的一个方面:路由是将请求(由URL和HTTP方法指定)路由到处理它们的代码去的一种机制. 路由过去是基于文件的,这很简单,但不灵活. IA 是指内容的概念性组织.在 ...
- 在ASP.NET Core中构建路由的5种方法
原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- 前端框架(kraken、Express、Node、MVC)
You know my loneliness is only kept for you, my sweet songs are only sang for you. 前端框架相关知识记录. krake ...
- Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由Route&Navigation
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
随机推荐
- 【 D3.js 入门系列 — 1 】 第一个程序 HelloWorld
记得以前刚上大一学 C 语言的时候,写的第一个程序就是在控制台上输出 HelloWorld .当时很纳闷,为什么要输出这个.老师解释说所有学编程入门的第一个程序都是在屏幕上输出 HelloWorld, ...
- Android Studio apk 打包流程
1.Build -> Generate Signed APK...,打开如下窗口 2.假设这里没有打过apk包,点击Create new,窗口如下 这里只要输入几个必要项 Key store p ...
- docker学习笔记11:Dockerfile 指令 CMD介绍
我们知道,通过docker run 创建并启动一个容器时,命令的最后可以指定容器启动后在容器内立即要执行的指令,如: docker run -i -t ubunu /bin/bash //表示容器 ...
- 基于visual Studio2013解决C语言竞赛题之0604二维数组置换
题目
- poi操作officePOI操作excel中的数据格式(日期类型)
7.3.3 POI中Excel文件Cell的类型 在读取每一个Cell的值的时候,通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型,如表7-3所示. 表7-3 C ...
- MYSQL设计优化
本文将从各方面介绍优化mysql设计的一些方式. 1.优化sql语句 (1)定位须要优化的sql语句 1)show status统计SQL语句频率 对Myisam和Innodb存储引擎都计数的參数: ...
- Vi/VIM键盘图, Vi/vim学习图
Vi/vim学习图 引用: Vi键盘图片可视化教程 http://www.cnblogs.com/me115/archive/2010/11/16/1878295.html 网上的文章易流失.感谢分享 ...
- sencha touch(7)——list组件
1.list组件是一个很强大的组件.用于以一览表的形式或者列表的形式展示应用程序中的大量的数据.该组件使用XTemplate模版来显示数据,同时与数据仓库进行绑定.所以当数据仓库中的数据发生变化的时候 ...
- JavaScript 字符串编码函数
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- Http方式获取网络数据
通过以下代码可以根据网址获取网页的html数据,安卓中获取网络数据的时候会用到,而且会用Java中的sax方式解析获取到数据.(sax解析主要是解析xml)具体代码如下: package com.wy ...