中间件是什么呢?

中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数。

为什么要使用中间件?

通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应。如body-parse中间件对post请求的参数进行处理让我们可以通过res.body快速获取请求参数,express-session中间件可以让我们对数据进行保存,express.static是express内置中间件,可以让我们快速处理静态资源,express.Router路由中间件等等
 
中间件如何使用?
Express中,对中间件进行了几种分类:
1.不关心请求路径和请求方法的中间件,通过app.use函数实现
app.use(function(req,res,next){})
客户端发起的任意请求都会经过这个中间件函数进行处理
next指下一个满足路径条件的中间件,如果有执行next,那么这个中间件执行完后就会执行下一个满足条件的中间件,如果没有next,就会忽略后面所有中间件
 
以下面代码为例(设服务器ip为127.0.0.1,后面所有例子都以该ip为例)
var express = require('express')
var app = express() app.use(function(req,res) {
res.end('404 NOT FOUND')
} app.listen(3000,function(){
console.log('running...');
}

所有对该服务器的请求最终都会返回404 NOT FOUND,无论是路径是什么

2.关心请求路径的中间件,通过app.use函数实现
app.use(路径,function(req,res,next){})
客户端发起的以第一个参数开头的路径才会进入该中间件
 
以下代码为例
var express  = require('express')
var app = express() app.use('/public',function(req,res,next) {
res.end('you are public');
} app.listen(3000,function(){
console.log('running...')
}

只要客户端访问该服务器的地址是以public开头(即127.0.0.1:3000/public/xxx),那么就会返回you are public 字符串

3.严格匹配路径的中间件,通过app.get/app.post等实现
也就是我们所说的服务器路由
app.get(路径,函数)
app.post(路径,函数)
只有严格匹配请求方式和请求路径的请求才会进入该中间件
 
以下面代码为例
var express = require('express')
var app = express()

// 中间件1
app.get('/get/puclic',function(req,res){
res.end('get!');
} // 中间件2
app.post('/post/public',function(req,res) {
res.end('post!');
} app.listen(3000,function(){
console.log('running...');
}

客户端只有通过get方式访问127.0.0.1:3000/get/public时才会进入中间件1,只有通过post方式访问127.0.0.1:3000/post/public时才会进入中间件2,只有这两者完全匹配才会进入对应的中间件

中间件的执行机制:
1.中间件的第一次执行是同步的,当一个请求发出到达服务器后,则按照顺序匹配所有中间件,当找到一个匹配时,则进入该中间件
2.如果该中间件最后没有执行next函数,则该请求在此中间件终止,不再进入后面的中间件;如果有,则会直接进入后面匹配的中间件中(此时不再是按顺序!)
3.重复1-2步
 
如果把客户端发起请求和服务器发出响应比作自来水的进入水库和输出水库,那么中间件就是水库里对水分别进行过滤沉淀消毒的各个小厂房,而中间件的函数的next参数就相当于每个小厂房的门,只有这个门打开了,处理完的请求的数据才能继续向后面的中间件发送,直至响应发出。
 
 

以下面的代码为例进一步说明中间件的执行顺序

var express = require('express');

var app = express()

//中间件1
app.use(function(req,res) {
console.log('非严格');
})

//中间件2
app.use('/public',function(req,res,next) {
console.log('半严格');
    next();
})

//中间件3
app.get('/public',function(req,res) {
console.log('严格 get');
})

//中间件4
app.post('/public',function(req,res) {
console.log('严格 post');
}) //中间件5
app.get('/public',function(req,res) {
console.log('严格 get');
})
app.listen(3000,function() { console.log('running...') })

此时客户端访问/public,那么首先会进入中间件1,因为有执行next函数,所以直接寻找后面能够匹配的中间件,进入中间件2,中间有执行next函数,所以进入中间件3,但是中间件3没有next函数,所以不再执行,所以输出的语句是‘非严格’ '半严格' '严格 get'

如果是下面代码,请求/public后结果又是怎样呢?

var express = require('express');

var app = express()

app.use('/img',function(req,res) {
console.log('半严格');
}) app.get('/public',function(req,res) {
console.log('严格 get');
}) app.post('/public',function(req,res) {
console.log('严格 post');
})
app.listen(3000,function() { console.log('running...') })

结果是输出'严格 get',请求到达服务器后,从上往下逐渐匹配,匹配到第二个中间件,进入执行,但是该中间件没有执行next函数,所以终止

综上所述,我们可以知道,第三方中间件的安装执行是有讲究的

对于一些封装请求数据方便我们操作以及处理静态资源的中间件我们应该放在路由中间件(即有发出服务器响应的中间件)之前编写,否则在编写路由时就无法使用封装好的数据。而对于返回404页面的路由可以放在所有中间件后面,这样无法找到的页面则会自动匹配到最后一个返回404页面
 
中间件的使用是灵活多变的,本文章只是简单概述其概念及其执行机制,更多技巧仍需读者自行体会
 
 

对于Node中Express框架的中间件概念的感知的更多相关文章

  1. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  2. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  3. node.js中express框架的基本使用

    express是一个基于node.js平台的,快速,开放,极简的web开发框架. 一.安装 express npm install express --save 二.简单使用 express //引入 ...

  4. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  5. node之Express框架

    Express是node的框架,通过Express我们快速搭建一个完整的网站,而不再只是前端了!所以Express还是非常值得学习的! express有各种中间件,我们可以在官方网站查询其用法. Ex ...

  6. Node.js Express 框架 Express

    Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...

  7. 44.Node.js Express 框架--web框架

    转自:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 简介 Express 是一个简洁而灵活的 node.js W ...

  8. Node.js+Express框架+Mongo学习(一)第一个node.js实例

    1.在桌面新建一个空的文件夹,比如叫node,当然也可以在其它地方新建. 2.命令行进入到所新建的文件夹的目录,下载Express框架,再在这个文件夹里新建一个叫final的项目 3.在项目(fina ...

  9. node中express的中间件之cookieParser

    cookieParser中间件用于获取web浏览器发送的cookie中的内容.在使用了cookieParser中间件后, 代表客户端请求的htto.IncomingMessage对象就具有了一个coo ...

随机推荐

  1. GoCN每日新闻(2019-11-04)

    GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04)   1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...

  2. c# 画正态分布图

    /// <summary> /// 提供正态分布的数据和图片 /// </summary> public class StandardDistribution { /// &l ...

  3. [转]【kafka】用 Docker 部署 Kafka

    ref : https://www.jianshu.com/p/7635ea96e53f 用 Docker 部署 Kafka   Kafka 简介 作为一个消息中间件,Kafka 以高扩展性.高吞吐量 ...

  4. 自己动手实现DNS协议

    1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...

  5. 高通平台sensor框架图【学习笔记】

  6. 微信小程序 调用远程接口,给全局数组赋值

    关键是 let that = this 因为在onLoad 的 wx.request方法里, this指的是 wx.request 的上下文, 所以应该是在 onLoad 的时候定义 let that ...

  7. HIVE出现Read past end of RLE integer from compressed stream Stream for column 1 kind LENGTH position: 359 length: 359 range: 0错误

    错误日志 Diagnostic Messages for this Task: Error: java.io.IOException: java.io.IOException: java.io.EOF ...

  8. Nginx接入gPRC

    gPRC官网:https://grpc.io/ NGINX将在1.13.10版本中包含grpc相关功能 这个版本支持NGINX代理gRPC TCP连接.可以用来: 发布gRPC服务,包括未加密/加密的 ...

  9. FastStone Capture 9.3 强烈推荐,常用功能介绍

    http://www.dayanzai.me/faststone-capture.html   经典优秀屏幕截图录像工具 FastStone Capture 9.3 绿色汉化中文版 下载 官网: ht ...

  10. 统计git提交代码量

    # a新增行数,d删除行数 git log  --author="`git config --get user.name`" --pretty="%H" --a ...