express中间件
中间件(Middleware)可以理解为一个对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。
Express支持的中间件
在express官网中可以看出express本身支持若干中间件:
- basicAuth:基本的身份认证功能,处理之后可以通过req.user属性访问被认证的用户对象
- bodyParser:完成请求体消息的三种转换功能:json(),urlencoded(),multipart(),这三个中间件可以分别使用,而bodyParse是对三者的统一封装
- compress:对response数据进行压缩处理
- cookieParser:对Cookie头进行处理,然后通过req.cookies属性来访问所有cookie对象
- cookieSession:提供对Session的支持。我们知道大部分的服务器Session其实是通过cookie来实现的。服务器端通过判断客户端发送的两次请求中某一个cookie项的值是否相同来认定是否是同一个session。处理之后可以通过req.session属性访问session对象
- csrf:对CSRF(跨域请求伪造)保护的支持。CSRF是指伪造他人请求发送给受攻击的站点。其防御方法有验证HTTP Refer字段;在请求地址中添加token并进行验证;在HTTP头中自定义属性并进行验证等等。该中间件就是通过生成token来解决的,生成的token可以通过req.csrfToken()来进行访问
- directory:使服务器的某项目录能够为外界所访问
Connect中间件框架
其实,express中的中间件就是使用了Connect中间件框架。它们是一种包含关系。此外,Connect和Express其实是同一个作者。
connect支持的中间件就非常多了。从主页中就可以看出:
其使用方法跟express中中间件的使用方法如出一辙,只是多了一些中间件而已。
园友luics将Connect中间件分为了三个部分:
- Pre-Request 通常用来改写request的原始数据
- Request/Response 大部分中间件都在这里,功能各异
- Post-Response 全局异常处理,改写response数据等
自己编写中间件
中间件函数作为插件被放到请求流中(request flow),在Connnect里使用 connect.use(),或在express中使用app.use()。一个自定义的中间件模块需要返回一个方法,这个方法理想情况下接受 req,res或next三个参数。
module.exports = function() { return function(req, res, next) { // Do Something to `req' or `res' // Pass to next middleware return next(); // Error occurred and pass to error handler return next(err); // Intercept the request and make response directly without pass to next middleware return res.send(XXX); // Hook on `res.end' to perform some decoration on response var end_ = res.end; res.end = function (text) { // Do something to response data ... end_.bind(this)(arg1, arg2, ...); }; } }
参考资料:
http://www.cnblogs.com/luics/archive/2012/11/28/2775206.html