OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

NodeJS中的Middleware是什么?在OnceIO中创建和使用中间件


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1477101022855
注意 转载须保留原文链接,译文链接,作者译者等信息。  

OnceIO是OnceDoc企业内容管理系统的底层Web框架,它可以实现模板文件、静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的性能,为您节约服务器成本。它可以让你对Web进行分布式存储,即一个扩展包里即可包含前端、后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展。这里是介绍如何使用OnceIO的一系列文章。

 

OnceIO 是一个自身功能极简,完全由路由、中间件和Handler构成的 web 开发框架:一个 OnceIO 应用本质上就是在调用各种中间件和Handler。  

中间件是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)),并将应用的请求-响应循环传向下一个中间件。

一个应用的请求-响应循环如下图所示,由请求对象、响应对象、中间件和 handler 构成:

-

Handler 针对请求发出响应,循环终结于此,一个请求-响应循环只会由一个 handler处理;但每个请求在到达 handler 之前会依次经过许多中间件,如Session、Securty(登录认证)、表单解析等都是典型的中间件,NoceJS中的MiddlerWare与Java中的Filter和.NET中的HttpModule概念类似。一个请求-响应循环也可以不经过中间件,比如说静态CSS/JS文件就没有执行Session、认证中间件的必要。

中间件的功能包括:

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终结请求-响应循环。
  • 调用堆栈中的下一个中间件。

如果当前中间件没有终结请求-响应循环,则必须调用 req.filter.next() 将控制权交给下一个中间件,否则请求就会挂起。

下面我们将以 Lesson 1 中简单的 'Hello World' 应用为例,为其增加两个中间件:能在终端输出一条简单消息的 myLogger 和能在网页上显示 HTTP 请求的时间戳的 requestTime.

var onceio = require('../onceio/onceio')
var app = onceio()


app.get('/', function(req, res) {
  res.end('Hello World!')
})
中间件函数 MYLOGGER

myLogger 函数会在 request 经过它时在 console 界面输出“LOGGED”。myLogger 函数的代码如下:

var myLogger = function(req, res) {
  console.log('LOGGED')
  req.filter.next()
}  

把 myLogger 添加到应用中:

var onceio = require('../onceio/onceio')
var app = onceio()


var myLogger = function(req, res) {
  console.log('LOGGED')
  req.filter.next()
}

app.use(myLogger)

app.get('/', function(req, res) {
  res.end('Hello World!')
})  

每当应用收到请求时,它都会在终端输出“LOGGED”:

myLogger console

中间件的加载顺序很重要:中间件必须要被首先加载并且被首先执行,否则在请求到达中间件之前请求-响应循环就被终止了,中间件将不被执行。

中间件函数 REQUESTTIME

接下来,我们创建一个叫做 requestTime 的中间件函数:

var requestTime = function(req, res) {
  req.requestTime = Date.now()
  req.filter.next()
}  

把 requestTime 添加到应用中:

var onceio = require('../onceio/onceio')
var app = onceio()


var requestTime = function(req, res) {
  req.requestTime = Date.now()
  req.filter.next()
}

app.use(requestTime)

app.get('/', function(req, res) {
  var responseText = 'Hello World!<br>';
  responseText += '<small>Requested at: ' + req.requestTime + '</small>';
  res.send(responseText);
})  

每当应用收到请求时,它都会在浏览器显示请求的时间戳:

requestTime

我们在这里只演示了两个简单的中间件,事实上中间件的种类和功能非常多样,例如,app.use() 函数可以有多达三个参数:

app.use('/file', function(req, res) {
   var user = req.session.get('user')
   if (!user || !user.username) {
     res.end('No permission')
     return
   }

   res.cache(0)
   req.filter.next()

}, { session: true })

其中第一个参数指定所有以“/file”开头的 URL(发起的请求)都会经过这个中间件;第三个参数指定这个中间件需要session支持。因为onceio的session对象可能是存放在数据库中的,从数据库获取session会有一定的性能损失,所以在设计时您可根据情况,比如说在用户界面、管理后台添加session解析支持。

中间件能访问请求对象、响应对象、堆栈中下一个中间件和整个 OnceIO API,因此它的用法拥有无限的可能性。

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 阿里任性Hr开除月饼极客:这样冰冷的公司没什么值得我留恋
  2. GitHub2016报告AngularJS流行度下降,JavaScript活跃度为Java两倍
  3. 在 2016 年学 JavaScript 是一种什么样的体验?
  4. 2016年收入最高的5个编程语言,JavaScript最流行,Java和C没在前5
  5. JavaScript函数式编程(一、二、三)
  6. 传言GITHUB正在寻求第二轮融资,或面临估值下降、清算或被微软收购
  7. Java 之父求职被嫌年纪大,硅谷公司现在喜欢“小鲜肉”,不爱“老古董”
  8. NodeJS中的Middleware是什么?在OnceIO中创建和使用中间件
  9. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. 用OnceIO(NodeJS)搭建简单的web服务器
  2. NodeJS中的Middleware是什么?在OnceIO中创建和使用中间件
  3. JavaScript函数式编程(一、二、三)
  4. JavaScript在物联网中的应用
  5. 如何编写 jQuery 插件
  6. NodeJS中npm3相对于npm2模块依赖目录层欠的改进
  7. JavaScript的 Event Loop 模型
  8. You Don't Need jQuery
  9. Node.js单元测试、集成测试、基准测试以及代码覆盖率测试方面总结
  10. 基础 JavaScript 装X指南

 关键字 - Node.JS
  1. Node.js框架之express
  2. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  3. Node.JS编码规范指南教程:教你优雅地写JavaScript代码
  4. Express入门教程:一个简单的博客
  5. NodeJS动态传参特性:不定个数参数的省略,默认值与解构
  6. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  7. 6款基于Node.JS的开源内容管理和静态网站生成系统
  8. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  9. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  10. 为什么你应该抛弃Express的视图渲染引擎

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号