中间件概述

Express框架中一个非常重要的概念——中间件。在Express框架中,允许通过中间件的使用来调用各种第三方类库,这让我们的开发工作变得更为方便,也使得我们可以开发出各种更为强大的应用程序。

一个中间件是一个用于处理客户端请求的函数。一个HTTP服务器中可能会使用到各种中间件。当接收到一个客户端请求时,首先将该请求提交给第一个中间件函数,每一个中间件函数内部封装一个next回调函数,在一个中间件函数内部可以判断是否调用next回调函数来处理该客户端请求。一个最简单的中间件的书写方法如下所示。

function middleware(req,res,next){next()}

在Express框架中,使用应用程序实例对象的use方法来调用一个中间件,该方法的使用方式如下所示。

app.use([path],function)

在use方法中,使用两个参数,其中path参数为可选参数,function参数为必须指定参数。path参数值为一个字符串,用于指定何种路径应用中间件,默认参数值为“/”。function参数值为一个函数,用于指定我们所要调用的中间件函数。

我们定义服务器端所要返回的状态码、响应头及返回页面中的标签中的内容。

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");

一般大型框架中都内置中间件,具体请查看框架中的具体方法