Express学习6--Express中间件技术

中间件技术

在实际工作中,需要对某些请求(或者某一类请求)进行特殊的处理,例如:要记录每一次请求的详细信息。

需求:在调用某个接口时,打印出调用者的ip地址及调用时间。此时需要使用到中间件技术。同时对express而言,中间件是它的一个非常重要的概念,掌握中间件的思想对于理解学习express,提升编程水平都有很大的帮助。

生活中的中间件

在这里插入图片描述

在上图中,自来水厂从获取水源到净化处理交给用户,中间经历了一系列的处理环节。

  • 一个流程结束之后,按顺序进入下一个流程;
  • 一个流程如果出了问题,下一个流程也会受影响。
  • 可以很方便地插入某一个特殊的处理环节,而不需要对原有环节造成影响。这样做的目的既提高了生产效率也保证了可维护性。

我们可以称其中的每一个处理环节就是一个中间件。

express中间件

中间件一个特殊的url地址处理函数

  • 中间件是 express 的最大特色,也是最重要的一个设计。Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。
  • 一个 express 应用,就是由许许多多的中间件来完成的

格式及基本示例

// 具名函数格式:
const handler1 = (req, res, next) => {
  console.log(Date.now());
  next();
}
app.use(handler1);

// 匿名函数格式:
app.use((req, res, next) => {
  console.log(Date.now());
  next();
});
  • 中间件本质就是一个函数,它被当作 app.use(中间件函数) 的参数来使用
  • 中间件函数中有三个基本参数, req、res、next
    • req就是请求相关的对象,它和下一个中间件函数中的req对象是一个对象
    • res就是响应相关的对象,它和下一个中间件函数中的res对象是一个对象
    • next:它是一个函数,调用它将会跳出当前的中间件函数,执行中间件;如果不调用next,则整个请求都会在当前中间件卡住,而得不到返回。

示例:使用中间件打印日志

var express = require('express')
var app = express()

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}
// 注册中间件
app.use(myLogger)

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)	

示例:使用多个中间件

app.use((req, res, next) => {
  console.log("第1个中间件");
  next();
});

app.use((req, res, next) => {
  console.log("第2个中间件");
  res.setHeader('content-type', 'text/html;charset=utf8');
  res.a = 1;
  next();
});

app.use((req, res, next) => {
  console.log("第3个中间件");
  res.b = 2;
  console.log(res.a,res.b)
  res.end('中间件');
});
  • 注意先后顺序。
  • 注意通过req来附加额外的信息。

示例:设定特定路径的中间件

var express = require('express')
var app = express()

app.use(function (req, res, next) {
  console.log('应用级中间件,能匹配所有请求')
  next()
})
app.use('/api1',function (req, res, next) {
  console.log('只匹配/api1请求')
  next()
})

app.get('/api1', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

中间件的执行流程

在这里插入图片描述

中间件的应用

模拟body-parser

app.use((req, res, next) => {
  if (req.method === 'POST') {
    let bodyStr = '';
    req.on('data', chunck => {
      bodyStr += chunck;
    });
    req.on('end', () => {
      req.body = qs.parse(bodyStr);
      next();
    });
  }
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值