中间件概述
Express框架中一个非常重要的概念——中间件。在Express框架中,允许通过中间件的使用来调用各种第三方类库,这让我们的开发工作变得更为方便,也使得我们可以开发出各种更为强大的应用程序。
一个中间件是一个用于处理客户端请求的函数。一个HTTP服务器中可能会使用到各种中间件。当接收到一个客户端请求时,首先将该请求提交给第一个中间件函数,每一个中间件函数内部封装一个next回调函数,在一个中间件函数内部可以判断是否调用next回调函数来处理该客户端请求。一个最简单的中间件的书写方法如下所示。
function middleware(req,res,next){next()}
在Express框架中,使用应用程序实例对象的use方法来调用一个中间件,该方法的使用方式如下所示。
app.use([path],function)
在use方法中,使用两个参数,其中path参数为可选参数,function参数为必须指定参数。path参数值为一个字符串,用于指定何种路径应用中间件,默认参数值为“/”。function参数值为一个函数,用于指定我们所要调用的中间件函数。
我们定义服务器端所要返回的状态码、响应头及返回页面中的<head>标签中的内容。
var setHeader = function() {
return function(req, res, next) {
res.statusCode=200;
res.header={'Content-Type': 'text/html'};
res.head='<head><meta charset="utf-8"/></head>';
next();
};
};
exports.setHeader = setHeader;
调用自定义中间件
var express = require('express');
var middleware = require('./middleware');
var app = express();
app.use(middleware.setHeader());
app.get('/', function(req,res) {
res.writeHead(res.statusCode,res.header);
res.write(res.head);
res.end('
你好');
});
app.listen(1337, "127.0.0.1");
use方法中的path参数使用示例
var express = require('express');
var middleware = require('./middleware');
var app = express();
app.use('/static',middleware.setHeader());
app.get('/*', function(req,res) {
if(res.head){
res.writeHead(res.statusCode,res.header);
res.write(res.head);
res.write('你好');
}
res.end();
});
app.listen(1337, "127.0.0.1");
在应用程序实例对象的get方法、post方法、put方法、delete方法或all方法中,均可使用一个或多个中间件参数。这些方法的完整使用方式如下所示。
app.get(path,[callback...],callback) //使用get方法
app.post(path,[callback...],callback) //使用post方法
app.put(path,[callback...],callback) //使用put方法
app.delete(path,[callback...],callback) //使用delete方法
app.all(path,[callback...],callback) //使用all方法
在这些方法的path参数值与callback参数值中间,可以使用一个或多个参数,每一个参数值均为一个中间件函数。在使用多个中间件函数时,当在前一个中间件函数中调用next方法时,调用后一个中间件函数,当在最后一个中间件函数中调用next方法时,调用最后一个callback参数值回调函数。
使用实例:
var express = require('express');
var middleware = require('./middleware');
var app = express();
app.get('/',middleware.setHeader(),function(req,res) {
res.writeHead(res.statusCode,res.header);
res.write(res.head);
res.end('你好');
});
app.listen(1337, "127.0.0.1");
一般大型框架中都内置中间件,具体请查看框架中的具体方法