怎样给connect/express.js写中间件

        如果你有想写属于自己的express.js中间件的想法,很可能你知道express.js实际上就是一个Connect(附带额外的特性),如果你还不知道它,或许你应该先静心地了解更多的Connect知识。

        如果你已经知道Connect是什么,并且想为它写一个中间件,那么你来对地方了。我将给展示怎样和express.js一起使用你自主牌子的中间件。

        在我们写中间间之前,我们需要知道它是什么。

        通常情况下,一个链接服务器的请求在HTTP response被生成前要经过一些方法。在连接期间这些方法按照惯例被称为“中间件”。这就是它,非常简单。

        使用Express.js或Connect,你可能遇到req,res和next对象们,中间件方法做它们的事情,如果需要并把req,res和next传给下一个线性方法。这就是中间件的工作机制。

        中间件函数作为插件被放到请求流中(request flow),通过在Connnect里使用 connect.use(),或在express中使用app.use().看看这个Connect的服务例子:

var http = require('http');
var connect = require('connect');

var app = connect();
app.use(function(req, res) {
    res.end('Hello!');
});

http.createServer(app).listen(3000);

         这仅有一个中间件,每一个向服务器的请求,它仅仅打印出“hello!”。

         尽管中间件都是函数,可以通过connect.use()方法把它作为插件使用,为了代码的重用和整洁,最好将它们开发成一个node.js的模块,而不是在connect.use()里定义一个方法。

         让我们创建一个禁止IP地址的中间件模块,我们称它为 "ipban",创建一个名叫ipban.js的文件,里面存有以下内容:

// list of banned IPs
var banned = [
'127.0.0.1',
'192.168.2.12'
];

// the middleware function
module.exports = function() {
    
    return function(req, res, next) {
        if (banned.indexOf(req.connection.remoteAddress) > -1) {
            res.end('Banned');
        }
        else { next(); }
    }
    
};

          现在,修改下链接服务的代码来使用我们的中间件:

var ipban = require('./ipban.js');
var app = connect();
app.use(ipban());
app.use(function(req, res) {
    res.end('Hello!');
});

          运行app并且尝试在浏览器里加载。嗙!被禁止了!运行app并且尝试在浏览器里加载。嗙!被禁止了!
          接下来呢?一个自定义的中间件模块需要返回一个方法,这个方法理想情况下接受 req,res或next三个参数。

          你可能已经注意到当初始化一个中间件是大部分都接受配置选项。那么我们使ipban能够这样做也是自然的。通过传递“on”或者”off“,ipban 将会有效或者无效。

          修改ipban.js文件:

// list of banned IPs
var banned = [
'127.0.0.1',
'192.168.2.12'
];

// middleware enabled or not
var enabled = true;

// the middleware function
module.exports = function(onoff) {
    
    enabled = (onoff == 'on') ? true : false;
    
    return function(req, res, next) {
        if (enabled && banned.indexOf(req.connection.remoteAddress) > -1) {
            res.end('Banned');
        }
        else { next(); }
    }
    
};

          同样,使用方法也需要改变:

app.use(ipban('off'));

          重启app,在浏览器里加载,不再被禁止!

         如果你的中间件不是http请求的终点,确保调用next(),否则你将以一个挂起的应用而结束。

         如果用express.js来使用这个中间件,我们就要这样做:

var ipfilter = require('./ipfilter');
app.configure(function(){
    app.use(ipfilter('on'));
...


         注意:中间件的顺序是非常重要的,它能启动也能断开你应用。

         我希望这个例子能够帮助你理解中间件是什么和怎样去编写它们。在这篇文章里你还有什么不明白的吗?如需了解更多的关于中间件的知识,请在评论里联系我。

  原文: http://www.hacksparrow.com/how-to-write-midddleware-for-connect-express-js.html

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3027087.html