怎样给connect/express.js写中间件
来源:互联网 发布:上海整站优化公司 编辑:程序博客网 时间:2024/05/22 17:30
如果你有想写属于自己的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 IPsvar banned = ['127.0.0.1','192.168.2.12'];// the middleware functionmodule.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 IPsvar banned = ['127.0.0.1','192.168.2.12'];// middleware enabled or notvar enabled = true;// the middleware functionmodule.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- 怎样给connect/express.js写中间件
- 写一个读取环境变量的Express中间件
- Mac node.js安装express中间件
- 理解Node.js中间件以及Connect 模块
- Node.js中的中间件与Connect
- 理解Node.js中间件以及Connect 模块
- express 中间件
- express 中间件
- node.js express 支持中文路由的中间件
- body-parser Node.js(Express) HTTP请求体解析中间件
- Express---node.js-express框架中的主要方法,使用中间件关联 多个路由
- 安装node.js的module(如express\connect\jade等)
- 介绍node.js的web框架 ---- express+connect框架
- Nodejs express之中间件
- Express validate 中间件
- Express中间件-01: 入门
- express 4中间件迁移
- express常用中间件
- 有关union的问题
- Linux C下实现线程池
- Python获取本机Ip地址
- 在64位Linux系统交叉编译32位软件:ffmpeg
- Centos安装mysql
- 怎样给connect/express.js写中间件
- Can't configure device. Expected JTAG ID code问题总结
- float类型能精确表达整型数100亿和1000亿吗?
- [HTML5-SVG]使用svg代替css3实现渐变
- 打包软件里面安装完打开网页
- 免费的响应式bootstrap管理员后台界面主题 - Charisma
- Java自学视频整理(持续更新中...)
- Android ListView性能优化
- 详解CASSANDRA0.7配置文件