十一、中间件的使用

         Express的应用本质上就是调用各种中间件,中间件指的是业务流程中的中间处理环节,服务器的生命周期一般是 接收 —— 处理 —— 响应;那么中间件就充当处理的角色,它其实就是一个函数,该函数除了能够访问请求对象req和响应对象res,还有next参数(next参数也是一个函数,通过next()可以将控制权交给下一个中间件,调用下一个函数),中间件分自定义中间件、第三方中间、内置中间件和错误中间件。

Express中间件格式:

app.get('/',function(req,res,next){
    // 处理业务逻辑;
    next();   // 调用下一个函数;
})

        中间件函数的形参列表中,必须包含next函数,而路由函数就只有req和res;


自定义中间件

全局生效

1 .在项目入口文件app.js当中定义中间件函数;

const express = require('express');
const app = express();
const getTimes = function getTimes(req,res,next){
    let t_1 = new Date();
    let rs = t_1.getTime();
    console.log("执行结果:",rs);
    next();
}

// 下面代码编写在此

2. 全局注册使用中间件;

app.use(getTimes);

3. 运行测试;

app.get('/',function(req,res){
    res.send('Wecome to express middleware!')
    console.log('已响应!');
})

// 监听端口
app.listen('3000',function(){
    console.log('Server Running ...')
})

        先处理完getTimes中间件的内容将执行结果出来,再将请求http://127.0.0.1:3000的响应结果响应给客户端!

        当然了你也可以简化形式进行代码编写:

const express = require('express');
const app = express();
app.use(function (req,res,next){
    let t_1 = new Date();
    let rs = t_1.getTime();
    console.log('执行结果:',rs);
    next();
})
app.get('/',function(req,res){
    res.send('Wecome to express middleware!')
    console.log('已响应!');
})
app.listen('3000',function(){
    console.log('Server Running ...')
})

        可以通过app.use() 进行连续定义多个中间件,客户端请求到达服务器时,中间会按定义的先后顺序依次进行调用:


局部生效

        全局的生效通过app.use()注册使用,而局部生效则是不使用app.use(),下面来进行定义局部生效的中间件:

const express = require('express');
const app = express();
const getTimes = function getTimes(req,res,next){
    let t_1 = new Date();
    let rs = t_1.getTime();
    console.log("执行结果:",rs);
    next();
}
app.get('/',getTimes,function(req,res){
    res.send('Wecome to express middleware!');
})
app.get('/user',function(req,res){
    res.send('user: admin');
    console.log('响应/user');
})
app.listen('3000',function(){
    consoel.log('Server Running ...');
})

多个局部中间件

const express = reqiure('express');
const app = express();
const getTimes = function getTimes(req,res,next){
    let t_1 = new Date();
    let rs = t_1.getTime();
    console.log("执行结果:",rs);
    next();
}
const getTimesVal = function getTimesVal(req,res,next){
    let t_2 = new Date();
    let rs = t_2.valueOf();
    console.log("执行结果:",rs);
    next();
}
app.get('/',getTimes,getTimesVal,function(req,res){
    res.send('Wecome to express middleware!')
    console.log('已响应!');
})
app.listen('3000',function(){
    console.log('Server Running ...')
})

还可以使用这种以下这种方式:

app.get('/',[getTimes,getTimesVal],function(req,res){
    // 响应内容
})

        客户端请求http://127.0.0.1:3000/ 会先处理中间件的内容再将响应结果响应给客户端 ,而http://127.0.0.1:3000/user


错误中间件

        错误中间件是专门用来捕获整个项目中的异常错误,从而防止项目异常崩溃的问题;错误中间件有四个参数:err、req、res和next,即使不使用next参数也必须声明,否则会被识别为普通的中间件不能处理错误,下面来定义一个错误中间件:

// /routes/index.js - 抛出错误路由
const express = require('express');
const router = express.Router();
router.get('/test',function(req,res,next){
    throw new Error('程序出现异常错误');
})
// 项目入口文件app.js
const express = require('express')
const app = express();
app.get('/',function(req,res){
    res.send('Wecome to express middleware!')
})
app.use(function(err,req,res,next){
    console.log('------------------ERROR-------------------');
    res.send('<h2>&nbsp;&nbsp;) '+ err.message +'</h2>')
    res.status(500).send(err.message);
})
app.listen('3000',function(){
    console.log('Server Running ...')
})

        这里需要注意的是错误中间件只有放在所有中间件、路由函数的后面才可以生效; 


内置中间件

        Express在4.x版本开始,Express的内置中间件作为单独模块存在,Express中内置了这三个比较常用的模块express.static、express.json、express.urlencoded;前面已经讲到了这个express.static,能够快速托管静态资源通过ap.use供外部访问;下面来简单的了解一下:

express.static(root,[options]);

        内置中间件的options可省略,采用默认值;同时也可以设置多个;

app.use(express.static('public'));
app.use(express.static('files'));

        挂载路径前缀:

app.use('/public',express.static('public'));

        具体的操作在express的基本使用中演示过就不在重复;看下一个express.json();express.json 用于解析JSON格式的请求体数据;下面通过Postman来进行测试:

未使用express.json对JSON格式的请求体数据解析:

app.post('/user',function(req,res){
    console.log(req.body);
    res.send('/user')
})

        req.body获取到的请求数据是undefined值,下面来使用进行express.json进行解析

app.use(express.json());

         下面是未使用 express.urlencoded 来获取url-encoded格式 的数据依然是undefined;

        使用 app.use(express.urlencoded) 解析x-www-from-urlencoded 格式;

app.use(express.urlencoded({extended:false}))

 内置中间件express.urlencoded 基于 body-parse 这个第三方的中间件进一步封装出来:

第三方中间件

        在Express4.x的版本当中会经常的使用body-parser第三方中间件来解析请求体数据,下面来安装使用第三方中间件使用:

1. 安装第三方中间件body-parser;

npm install body-parser

2. 导入中间件require和app.use()注册使用;

const express = require('express');
const app = express();
const parser = require('body-parser')
app.use(parser.urlencoded({extended:false}))
app.get('/',function(req,res){
    res.send('Wecome to express middleware!')
})
app.post('/user',function(req,res){
    res.send('/user');
    console.log(req.body);
})
app.listen('3000',function(){
    console.log('Server Running ...')
})


将自定义中间件封装为模块

        下面使用内置模块querystring,该模块是处理查询字符串,通过这个模块提供的parse()函数,可以将查询字符串解析成对象格式:

// custom.js ——  封装中间件
const qs = require('querystring');

const bodyParser = function(req,res,next){
    let str = '';
    req.on('data',function(chunk){
        str += chunk;
    })
    req.on('end',function(){
        const body = qs.parser('str');
        req.body = body;
    })
    next();
}
module.exports = bodyParser

        引入来使用该中间件并使用Postman进行测试:

// index.js
const express = require('express');
const app = express();
app.get('/',function(req,res){
    res.send('Wecome to express middleware!')
})
app.post('/user',function(req,res){
    res.send('/user');
    console.log(req.body);
})
app.listen('3000',function(){
    console.log('Server Running ...')
})

        以上就是本篇目的全部内容,在后续篇目中来进一步的在综合案例中来去体现,感谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵魂学者

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值