Express中间件
中间件的概念
从请求发送至服务器到服务端处理完后响应,分步骤来处理,那么每一个步骤就是一个中间件,就像工厂的流水线工作原理一样,产品需要分多个步骤来加工,那么每一道工序就是一个中间件
- 一个中间件本质就是一个处理函数(参数:request请求对象、response响应对象、next下一个中间件)
- 一个请求所匹配的中间件函数中所有request、response都是同一个对象
var express = require('express');
var app = express();
app.get('/index',function(req,res,next){
// 同一个请求的req和res是一样的,
// 可以前面存储下面用
req.foo = 'bar';
next();
});
app.get('/index',function(req,res,next){
console.log(req.body);
});
app.listen(3000, function() {
console.log('app is running at port 3000.');
});
中间件的匹配规则
-
Express根据每个中间件的路径和请求方法进行匹配
-
当请求进来,会从第一个中间件开始进行匹配
- 匹配成功则调用该中间件函数,执行里面的代码
- 执行了next( ),那么会继续向下匹配中间件
- 没有执行next( ),将结束匹配,即使下面有匹配的中间件函数,也不会调用
- 不匹配,则向后依次对比匹配
中间件的分类
应用程序级别的中间件
匹配任何请求路径和请求方法
app.use(function(req,res,next){
console.log('Time',Date.now());
next();
});
匹配请求路径为/index或者/index开头的任何请求方法
app.use('/index',function(req,res,next){
console.log('Time',Date.now());
next();
});
路由级别的中间件
注:以下请求路径必须是/index或者/index/,/index/xxx是不能匹配到的
匹配请求路径为/index的get请求方法
app.get('/index',function(req,res){
res.send('get');
});
匹配请求路径为/index的post请求方法
app.post('/index',function(req,res){
res.send('post');
});
匹配请求路径为/index的put请求方法
app.put('/index',function(req,res){
res.send('put');
});
匹配请求路径为/index的delete请求方法
app.delete('/index',function(req,res){
res.send('delete');
});
错误处理中间件
在最后配置找不到页面的中间件,当上面都没有匹配,则会匹配该中间件
app.use(function(req,res){
res.send('404 找不到页面');
});
在最后配置全局错误处理中间件,该中间件必须有四个参数,第一个参数err是之前在其他中间件调用 next()
存入的,只有在之前调用过next()
并且存入err参数,该中间件才会被匹配到
app.get('/index', function(req, res, next) {
fs.readFile('./index', function(err, data) {
if (err) {
// 当调用next()存入err参数后,会往下继续匹配,此时只会匹配到全局错误处理中间件
next(err);
}
res.send(data)
})
});
//全局错误处理中间件
app.use(function(err,req,res,next){
res.status(500).json({
err_code:500,
message:err.message
});
});
内置中间件
express.static(提供静态文件),配置后能够访问到./public中所有文件
// 当以/public/开头的请求,会去./public/目录中找对应资源
app.use('/public/',express.static(path.join(__dirname, './public')));
第三方中间件
参考文档:http://expressjs.com/en/resources/middleware.html
- body-parser
- compression
- cookie-parser
- mogran
- response-time
- server-static
- session