中间件是什么呢?

中间件就是客户端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. nginx.conf 配置解析之 server配置

    server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点) 以下为nginx.conf配置文件中server{  }部分的内容. server { listen ; // ...

  2. 第08组 Alpha事后诸葛亮

    组长博客 点这里! 总结思考 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 弥补Powerpoint中模板转换存在的缺陷,完善PPT模板一键转换的功能 ...

  3. adb 常用命令一

    1.install 和uninstall adb -s 设备号 install 安装包路径   adb uninstall package名 2.pull 和push: adb pull /sdcar ...

  4. /etc/resolv.conf文件中的search项作用

    resolv.conf文件中有search项时,主机名解析规则顺序: DNS配置文件如下: # vi /etc/resolv.conf # Generated by NetworkManager se ...

  5. DELPHI开始支持LINUX DOCKER

    DELPHI开始支持LINUX DOCKER 本方翻译自Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级容器而不是物理机器或虚拟机已经变得越 ...

  6. JavaScript的filter方法

    var ages = [32, 33, 16, 40]; function checkAdult(age) { return age >= 18; } function myFunction() ...

  7. mod_spatialite.so.7

  8. git 执行 git reset HEAD 报 Unstaged changes after reset

    Unstaged changes after reset 解决的办法如下2中办法: 1. git add . git reset --hard   2. git stash git stash dro ...

  9. (原创)C++ 同步队列

    (原创)C++ 同步队列 同步队列作为一个线程安全的数据共享区,经常用于线程之间数据读取,比如半同步半异步线程池的同步队列. 其实做起来比较简单,要用到list.锁和条件变量,条件变量的作用是在队列满 ...

  10. start & stop kafka cluster shell script

    kafka_start_cluster.sh #!/bin/bash brokers="kafka-server-1 kafka-server-2 kafka-server-3" ...