一、应用级中间件
应用级中间件绑定到 app 对象 使用
app.use()
和 app.METHOD()
, 其中, METHOD
是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。如果这个中间件要作用于具体的请求方法那么使用app.METHOD()。如果是要作用于全部的请求方法那么使用app.use()
例如:
1、引入框架和监听端口
var express = require('express');//引入express框架 var app = express(); app.listen(9000);//监听9000端口 // 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求(不管是put、post或是其他请求)都会执行它 app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method); next(); }); // 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求 app.get('/user/:id', function (req, res, next) { res.send('USER'); }); 备注:next();函数是运行下一个同名的中间件,如上,如果不调用next();那么app.get(),这个中间件将不会执行
2、为路由定义多个中间件的注意点
app.get('/user/:id', function (req, res, next) { console.log('ID:', req.params.id); next(); }, function (req, res, next) { res.send('User Info'); }); // 处理 /user/:id, 打印出用户 id,这个中间件将不会执行,因为上一个中间件使用res.send('User Info');就已经终止了该次请求 app.get('/user/:id', function (req, res, next) { res.end(req.params.id); });
二、路由级的中间件(路由级的中间件和应用级的并没有多大的区别,只是需要件路由中间件挂载到应用)
var app = express(); var router = express.Router(); // 处理 /user/:id, 渲染一个特殊页面 router.get('/user/:id', function (req, res, next) { console.log(req.params.id); res.render('special'); }); // 将路由挂载至应用 app.use('/', router);
三、错误的中间件:
错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。
错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res, next)。
app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); });
四、第三方中间件
通过使用第三方中间件从而为 Express 应用增加更多功能。
安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。
下面的例子安装并加载了一个解析 cookie 的中间件: cookie-parser
$ npm install cookie-parser var express = require('express'); var app = express(); var cookieParser = require('cookie-parser'); // 加载用于解析 cookie 的中间件 app.use(cookieParser());参考:http://www.expressjs.com.cn/guide/using-middleware.html