express中间件详解

概念
一个请求发送到服务器,要经历一个生命周期,服务端要: 监听请求-解析请求-响应请求,服务器在处理这一过程的时候,有时候就很复杂了,将这些复杂的业务拆开成一个个子部分,子部分就是一个个中间件。对于处理请求来说,在响应发出之前,可以对请求和该级响应做一些操作,并且可以将这个处理结果传递给下一个处理步骤

中间件就可以理解成一个对请求进行过滤和预处理的东西

中间件分类有:应用级中间件、路由级中间件、错误处理中间件、内置中间件、第三方中间件。
中间件运行机制,例如

var express = require('express');
var app = express();
app.get('/', function(req, res, next) {
    next(); 
});
app.get('/end', function(req, res) {
    res.send('程序到我这里就结束了,没有next方法');
})
app.listen(3000);

上面代码中req表示请求,res 响应对象,在当前中间件函数没有结束请求/响应循环, 调用next(), 将控制权传递给下一个中间件函数继续往下处理,否则页面到此会被挂起。
next()函数不是nodejs或者express的函数,而是传递中间件函数的第三变量,调用它之后会将调用应用程序中的下一个中间件程序。
中间件使用
使用app.use()函数将应用程序级中间件绑定到app对象的实例,在初级开发中常用到内置中间件。

const express = require('express');
let app= express();
app.listen(8080);
app.get('/reg', (req, res, next) => {
  res.send('ok');
});
app.use(express.static('./static/'));

通过app.use使用中间件,在express.static中传入文件路径,在客户端发起文件请求时,服务器就会在该路径下查找对应文件。
在处理前端发送过来的请求(get、post)处理时,通过app.get和app.post来处理,读取get请求过来的数据时req.query方法可以得到,post就需要利用到中间件进行处理得到请求过来的对象。

const express = require('express');
// 需要导入第三方模块body-parser
const body = require('body-parser');
let app= express();
app.listen(8080);
// 2中间件处理
app.use(body.urlencoded({
  extended: false // 是否开启扩展模式
}));
// 3请求响应处理
app.post('/reg', {req, res} => {
    let { name, pwd } = req.body;
    res.send('ok');
})

首先引入中间件,这个中间件的使用就要放到路由之前了,因为它是对请求数据的处理,使用了该中间件后,请求对象req上就会多出一个body属性,body属性装载的就是请求的数据。通过body就可以拿到请求的参数;
这里我们演示两个比较重要和常用的第三方中间件,掌握如何使用中中间件之后(就是调用"app.use(…)" )。其他第三方中间件的使用就大同小异了,至于为什么express.static中间件是调用express.static(),而body-parser中间件是调用body.urlencoded(),这就是开发时设定好了,具体调用方式和配置参数可以参考文档。
错误处理中间件
错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个。基本代码结构如下

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

总结
express 中间件函数,帮助拆解主程序的业务逻辑,并且每一个的中间件函数处理的结果都会传递给下一个中间件函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值