Express学习(2) ------ 中间件
TJ Holowaychuck 将 “中间件”描述为易于挂载和调用的模块,可以“无序”使用,并有利于应用的快速开发。
1, 中间件是一个模块。在js中,模块意味着函数,所以中间件是一个函数。那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行逻辑,然后或者结束响应,或者把它传递给下一个中间件组件。
- 拦截http服务器提供的请求和响应对象,这表明它必须接受两个参数: 请求对象(req),响应对象(res),就是http.createServer回调函数中的两个参数;
- 执行逻辑,就是在函数内对请求和响应对象进行操作;
- 或者把它传递给下一个中间件组件,那么它还有一个可选的参数, next, 它是一个回调函数,在函数内部调用,就表示这个组件已经完成了它的工作,可以执行下一个中间件了。
根据描述,创建两个简单的中间件:logger将请求输出到控制台中,hello用hello world 作为请求的响应。
// logger中件间,有next参数
let logger =function(req,res,next){
console.log(req.url);
next();
}
// hello 中间件,没有next 参数。
let hello = function(req,res){
res.setHeader(200, {"content-type": "text/html"});
res.end("hello world");
}
2, 中间件的使用。
新建node 文件夹, npm init -y快速创建package.json文件。npm install express --save 安装express. 创建index.js 文件如下
let express = require("express"); // 引入express
let app = express(); // connect() 创建服务器。
// logger中件间,有next参数
let logger =function(req,res,next){
console.log(req.url);
next();
}
// hello 中间件,没有next 参数。
let hello = function(req,res){
res.writeHeader(200, {"content-type": "text/html"});
res.end("hello world");
}
// use使用中间件
app.use(logger);
app.use(hello);
app.listen(8080)
这时调用cmd命令窗口,输入node index 启动服务器,浏览器中输入localhost:8080, 可以看到hello world,同时控制台中输出 /. 我们用中间件的方式重写了hello world 程序。
3, 中间件使用的有序和无序
中间件可以无序地使用,app.use(logger) 和app.use(hello) 调换一下位置试一下。
// use使用中间件 app.use(hello); app.use(logger); app.listen(8080)
重启node 服务器,可以看到页面中仍然有hello world, 我们的程序仍然是正常运行的。但是我们的控制台中没有任何输出,logger 没有起作用,这很好理解,因为hello函数中没有next 方法,当它里面的逻辑执行完以后,就不能执行下一个中间件了。这也表明中间件的顺序非常重要。
还有一个是错误处理,如果一个中间件中存在错误,那么它就会简单地向下传递,如果最生一个中间件还是没有处理,它就会一直存在,所以一般错误处理中间件都是放到最后,如果有任何错误,都会进行处理,不会使程序崩溃。
总结:虽然中间件可以无序的使用,但是我们必须给它规化好顺序,让它按照我们指定的顺序依次执行,以达到我们想要的效果。
4, 中间件的挂载。
以上说的都是中间件的易于调用,这里说一下中间件的挂载。所谓挂载,就是在使用中间件的时候,在它前面添加一个路径,只有在请求的url 中带有此路径,才会调用这个中间件,那么app.use 方法就需要接受两个参数,第一个参数就是路径,第二个参数就是中间件,如 app.use("admin", admin) 添加一个admin 中间件
// admin 中间件,只有在admin路径下才可以调用
let admin = function(req,res){
switch (req.url){
case '/':
res.end("try user")
break;
case '/user' :
res.end("hello user");
break;
}
}
// use使用中间件
app.use(logger);
app.use('/admin',admin); // admin 中间件挂载到路径下。
app.use(hello);
app.listen(8080)
这时在浏览器地址栏中输入localhost:8080, 可以看到hello world,证明并没有执行admin中间件。当输入localhost:8080/admin时,可以看到try user ,表明它执行了admin中间件,且是第一个case, 再输入localhost:8080/admin/user,可以看到 hello user. 它还是执行了admin 中间件,第二个case. 挂载,就是给这个中间件定义一个路径,只有在访问该路径的时候,它才执行。
5, 创建可以配置的中间件,使它更加通用和重用,有利于应用程序的快速开发。
为了创建可以配置的中间件,中间件都会遵循一个原则:用函数去返回中间件函数,就是我们上面写的中间件比如logger 要包在一个函数里面,使用中间件的时候,要用到函数的调用来返回这个中间件。
function logger (format) {
let regexp = /:(\w+)/g;
return function(req,res, next) {
let str = format.replace(regexp, function(match,property){
return req[property]
})
console.log(str);
next();
}
}// logger 中间件调用app.use(logger(":url"));
可以看到程序仍然可以正常运行。 为了重用更加彻底,我们可以把这个函数放到一个js文件中, 然后暴露出来,做成真正的模块。
Express学习(2) ------ 中间件的更多相关文章
- express学习(三)—— cookie和session
express学习(三)-- cookie和session cookie存在浏览器中,最大只能保存4K数据,不安全 session存在服务器中,不能独立(先读取cookie再读取session),较安 ...
- express-13 中间件
简介 从概念上讲,中间件是一种功能的封装方式,具体来说就是封装在程序中处理HTTP请求的功能. 中间件是在管道中执行的,在Express程序中,通过调用app.use向管道中插入中间件.(在Expre ...
- Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)
原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...
- Express学习(1) ------Express 入门
Express 是node 第三方框架,大家都知道,框架的意义就在于能大大简化程序地开发.那么我们就看一下Express是怎么简化node程序开发的. 1,用Express写一个hello world ...
- 理解express中的中间件
express是轻量灵活的node.js Web应用框架”.它可以帮助你快速搭建web应用.express是一个自身功能极简,完全是由**路由**和**中间件**构成的一个web开发框架,本质上说,一 ...
- 对于Node中Express框架的中间件概念的感知
中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...
- express学习(二)—— Post()类型和中间件
1.数据:GET.POST 2.中间件:使用.写.链式操作 GET-无需中间件 req.query POST-需要"body-parser" server.use(bodyPars ...
- express学习点滴- session()和cookieSession()的区别
express 里提供了两种有关session的中间件 * session() 提供了内存和数据库两种方式保存session.具体两种session原理请自行学习,不进行展开了.自己也是一知半解... ...
- express学习-express搭建后台
前言:本文是纯用node express做一个后端服务的教程,并不等同于express官网的入门教程,本文也并不涉及任何高级的Node服务端性能优化等知识. 本文是在已经看过express官方入门指南 ...
随机推荐
- jmeter(二十三)分布式测试
jmeter用了一年多,也断断续续写了一些相关的博客,突然发现没有写过分布式测试的一些东西,这篇博客就介绍下利用jmeter做分布式测试的一些技术点吧,权当参考... 关于jmeter的介绍和元件作用 ...
- ORACLE存储过程中%TYPE和%ROWTYPE的区别
ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...
- IntelliJ IDEA 高效率配置
之前学习和开发的时候一直用Eclipse,现在转战IDEA,记录一下IDEA的个性化设置,有助于提高效率.(参考:http://www.cnblogs.com/huaxingtianxia/p/586 ...
- 圆角矩形shader
在游戏中,有时需要对一张矩形图片进行切割,绘制成圆角矩形. circelrect.vert attribute vec4 a_position; attribute vec4 a_normal; at ...
- [Luogu4916]魔力环[Burnside引理、组合计数、容斥]
题意 题目链接 分析 sπo yyb 代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; #defi ...
- win 2008 R2 或以上版本,只有C盘情况下,PHP上传文件,显示不了解决办法
主要问题:因为没权限 解决办法:给C:\Windows\Temp 加上IIS账户读写权限
- 启发式合并 splay合并 线段树合并基础
Gold is everywhen! - somebody 启发式合并 将小的集合一个个插入到大的集合. 每次新集合大小至少比小集合大一倍,因此每个元素最多合并\(\log n\)次,总复杂度为\(n ...
- JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数
jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...
- debian下 Hadoop 1.0.4 集群配置及运行WordCount
说明:我用的是压缩包安装,不是安装包 官网安装说明:http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html,繁冗,看的眼花...大部分人应该都不 ...
- node.js介绍和npm的使用
Node.js介绍 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一个基 ...