一、编写中间件

中间件函数能够访问请求对象(req),响应对象(res),应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为next的变量来表示。

中间件函数可以执行以下任务:

  • 执行任何代码
  • 对请求或响应对象进行更改
  • 结束请求/响应循环
  • 调用堆栈中的下一个中间件

    注意:如果中间件函数没有结束请求/响应循环,那么必须调用next()函数,以将控制权传递给下一个中间件,否则请求将保持挂起状态。

1.创建一个中间件函数

var myLogger = function(req,res,next) {
console.log('logger')
next();
}

2.装入中间件

要装入中间件,要调用app.use(),并指定中间件函数。

var express = require('express')
var app = express() var myLogger = function(req,res,next) {
console.log('logger')
next();
}
app.use(myLogger)
app.get('/', function (req, res) {
res.send('Hello World!');
}); app.listen(3000);

中间件装入的顺序很重要,首先装入的中间件函数也首先被执行

二、使用中间件

Express是一个路由和中间件web框架。其自身只具有最低程度的功能。Express应用程序基本上是一系列中间件函数调用。

1.Express中间件的分类

  • 应用层中间件
  • 路由器层中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

1.1应用层中间件

使用app.use()或者app.Method()函数将应用层中间件绑定到应用程序对象的实例上。

//应用程序每次收到请求时执行该函数
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
}); //此示例显示安装在 /user/:id 路径中的中间件函数。在 /user/:id 路径中为任何类型的 HTTP 请求执行此函数
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
}); //此示例显示一个路由及其处理程序函数(中间件系统)。此函数处理针对 /user/:id 路径的 GET 请求
app.get('/user/:id', function (req, res, next) {
res.send('USER');
}); //在安装点使用安装路径装入一系列中间件函数的示例。 它演示一个中间件子堆栈,用于显示针对 /user/:id 路径的任何类型 HTTP 请求的信息
app.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
});

要跳过路由器中间件堆栈中剩余的中间件函数,请调用 next('route') 将控制权传递给下一个路由。

注:next('route') 仅在使用 app.METHOD() 或 router.METHOD() 函数装入的中间件函数中有效

1.2路由器层中间件

路由器中间件的工作方式与应用层中间件类似,差异之处在于它绑定到express.Router()的实例上。

var router = express.Router()

使用 router.use() 和 router.METHOD() 函数装入路由器层中间件

var app = express();
var router = express.Router(); router.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
}); router.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
}); router.get('/user/:id', function (req, res, next) {
if (req.params.id == 0) next('route');
else next();
}, function (req, res, next) {
res.render('regular');
}); router.get('/user/:id', function (req, res, next) {
console.log(req.params.id);
res.render('special');
}); app.use('/', router);

1.3错误处理中间件

错误处理中间件始终采用4个自变量。必须提供4个自变量,以将函数标识为错误处理中间件。即使无需使用 next 对象,也必须指定该对象以保持特征符的有效性。否则,next 对象将被解释为常规中间件,从而无法处理错误

app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});

1.4内置中间件

自 V4.x 起,Express 不再依赖于 Connect。除 express.static 外,先前 Express 随附的所有中间件函数现在以单独模块的形式提供。

1.5第三方中间件

使用第三方中间件向Express应用程序添加功能。安装具有所需功能的 Node.js 模块,然后在应用层或路由器层的应用程序中将其加装入。

//安装cookie-parser
npm i cookie-parser var express = require('express')
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser());

Express中间件的更多相关文章

  1. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  2. 1.express中间件的简介

    express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...

  3. Express中间件的原理及实现

    在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...

  4. vue+webpack+express中间件接口使用

    环境:vue 2.9.3; webpack 目的:接口的调用 跨域方式: 1.express中间的使用 2.nginx代理 3.谷歌浏览器跨域设置 -------------------------- ...

  5. express 中间件

    [express 中间件] 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 ...

  6. express中间件原理 && 实现

    一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...

  7. express中间件的理解

    参考 :https://blog.csdn.net/huang100qi/article/details/80220012 Express中间件分为三种内置中间件.自定义中间件.第三方中间件 可以与n ...

  8. 浅析express以及express中间件

    一.express: 1.express: Express是什么? Express是基于node.js平台的web应用开发框架: 作用:可以实现快速搭建骨架: 优点:开发web应用更加方便,更加快捷. ...

  9. Express中间件简单的实现原理

    上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...

随机推荐

  1. 【bzoj题解】1012 最大数

    题目描述 现在请求你维护一个数列,要求提供以下两种操作:1.查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作.语法:A ...

  2. KL散度(Kullback–Leibler divergence)

    KL散度是度量两个分布之间差异的函数.在各种变分方法中,都有它的身影. 转自:https://zhuanlan.zhihu.com/p/22464760 一维高斯分布的KL散度 多维高斯分布的KL散度 ...

  3. Linux 内核驱动--多点触摸接口【转】

    转自:http://blog.csdn.net/joard_yang/article/details/6225937 译自:linux-2.6.31.14/Documentation/input/mu ...

  4. Java WebService Axis 初探

    最近在学习WebService 开始了: 一:服务端的编写与发布 1. 工具准备: java的开发环境(这里就不多说了).   axis2官网上下载最新的就可以了(我这里用的是axis2-1.4.1- ...

  5. samba和SELINUX 冲突

    在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”. setsebool -P samba_enable_home_dirs on setsebo ...

  6. 使用dos命令创建多模块Maven项目

    好吧,咱们接着上一篇博客继续用另一种方式来创建Maven项目.不过在创建之前我们应该先熟悉一些相关dos命令. 创建web项目命令: mvn archetype:generate -DgroupId= ...

  7. 使用mui框架打开页面的几种不同方式

    1.创建子页面: list.html就是index.html的子页面,创建代码比较简单,如下: mui.init({ subpages: [{ url: 'list.html', //子页面HTML地 ...

  8. 向SQL Server 现有表中添加新列并添加描述.

    注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先 ...

  9. CentOS7 64位下MySQL5.7安装与配置(YUM)转

    安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...

  10. Java小实验之数据转换

    看到有人问如图的程序,就去写了几行代码,顺便复习一下条件语句和ASCII码 import java.util.Scanner; public class test1 { public static v ...