更新中~
express 中间件
中间件的作用一般是为了实现业务的解耦,提供访问的接口。在express中,中间件函数能够访问请求对象(req),响应对象(res)以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next的变量来表示。中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中的下一个中间件。
简单应用
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!'); //一个简单的中间件
});
app.listen(3000);
在上述代码中,获取express实例后对客户端请求的api(localhost:3000)进行响应
分类
express的各个中间件也是有所不同的,可以分为下面的五种。
1.应用层中间件
对请求进行处理,执行相应的逻辑等,并对可以想下一个中间件传递
var express = require('express');
var app = express();
app.use(function (req, res, next) { //没有路由参数,默认匹配所有路径
console.log('app use2'); //输出在控制台
next(); //传递给url相匹配的下一个中间件
});
app.get('/', function (req, res, next) {
res.send('hello'); //输出在页面
next(); // 传递给下一个中间件
}, function (req, res, next) {
console.log('world'); //输出在控制台
next(); //传递给下一个中间件
});
app.get('/', function (req, res) {
console.log('two'); //输出在控制台
});
app.use(function (req, res) {
console.log('app use2'); //不会输出,因为在上一个中间件已经结束请求
});
app.listen(3000, function () {
console.log('listen 3000 port');
});
上述代码中,app.use()若是没有第一个路由参数,默认为所有请求都运行其所带有的中间件函数,其中next()函数的作用是为了将控制权转交给下一个可以匹配路由的中间件。
2.路由器层中间件
/*
* next()函数的路由跳转
* */
var express = require('express');
var app = express();
app.use(function (req, res, next) {
console.log('app use1'); //输出在控制台
next(); //转交控制权给下一个中间件
});
app.get('/:name', function (req, res, next) {
res.send('hello' + req.params.name); //输出在页面
next('route'); // 跳过下一个中间件,直接匹配下一个路由
}, function (req, res) {
console.log('middle'); //不输出
});
app.get('/:name', function (req, res) {
console.log('my name is douqing'); //输出在控制台
});
app.use(function (req, res) {
console.log('app use2'); //不输出
});
app.listen(3000, function () {
console.log('listen 3000 port');
});
路由处理中间件可以跳过之后的路由知道遇到下一个路由匹配的路由,再次进行处理。
3.错误处理中间件
var express = require('express');
var app = express();
// a middleware bind to a path
app.get('/', function (req, res, next) {
console.log(kk); //声明一个错误,未声明kk
});
app.use(function (err, req, res, next) { //错误处理函数
console.error('error ' + err.stack);
res.status(500).send('Something broke!');
next(err); //控制权转交给下一个错误处理函数
});
app.use(function (err, req, res, next) {
console.log('err'); //输出err
});
app.listen(3000, function () {
console.log('listen 3000 port');
});
在错误处理中间件中,错误处理函数需要4为参数,对之前的中间件错误进行捕获处理。
4.内置中间件
var express = require('express');
var app = express();
app.use(express.static('public', {
dotfiles: 'ignore',
etag: false,
extensions: ['html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}
}));
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
5.第三方中间件
const express = require('express');
const cookieParser = require('cookie-parser'); //使用cookies-parser第三方中间件
const app = express();
app.use(cookieParser());
app.get('/', function (req, res) {
res.send('Hello, world!');
});
app.get('/set-cookies', function (req, res) {
res.cookie('token', 'mike:123456').end();//设置中间件
});
app.get('/cookies', function (req, res) {
res.send(req.cookies);
});
app.listen(3000, function () {
console.log('Server listening at http://localhost:3000');
});
更多的第三方中间件:http://expressjs.com/zh-cn/resources/middleware.html
github demo:https://github.com/DQing/express-middleware-demo