zoukankan      html  css  js  c++  java
  • 怎样给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

  • 相关阅读:
    The 2014 ACM-ICPC Asia Xi'an Regional Contest — F题 Color
    CodeForces 358D — Dima and Hares
    VIJOS国庆节模拟赛之繁星春水
    两个算法
    HDU 4901
    Andrew Stankevich Contests #2
    HDU 4701
    HDU 5033
    程序安装出现错误代码为2869
    常用正则表达式总结(以后加了再补充)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3027087.html
Copyright © 2011-2022 走看看