您的位置:首页 > Web前端 > JavaScript

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

2013-04-17 21:10 323 查看
如果你有想写属于自己的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: