位置:首页 » 技术 » NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

日期:2016-10-22 阅读:118num
Advertisement

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

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

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

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

NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

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”:

NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

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

中间件函数 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);
})

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

NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

我们在这里只演示了两个简单的中间件,事实上中间件的种类和功能非常多样,例如,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,因此它的用法拥有无限的可能性。

相关文章
  • NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件 NODEJS中的MIDDLEWARE是什么?在ONCEIO中创建和使用中间件

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

  • 如何在代码中直接获得某个对象在内存中的大小? JavaScript 的 ~

    如何在代码( JS in Node )中直接获得某个对象在内存中的大小? JavaScript 中的对象是否也如 Python 一样,每个变量仅存对象的引用值,多个变量可以共用一个对象? --cut-- ttph1oc在2016-05-09 06:28:48回答到: 1. npmjs.com/package/object-sizeof 2. 是 haozhang在2016-05-09 06:28:48回答到: 2.有哪个面向对象的语言不是这么干的...

  • 印象笔记中的邮件怎么保存到邮箱中? 印象笔记中的邮件怎么保存到邮箱中?

    印象笔记中的邮件怎么保存到邮箱中?不管我们是上班还是上学,电子邮件确实都是绕不过去的一个交流工具,你可以将邮件转到私有邮箱地址,将邮件保存到印象笔记. 1.保存邮件只需要一键发送到一个特殊的地址 印象笔记中的邮件怎么保存到邮箱中?无论是写邮件.还是收到的邮件都可以抄送或者转发到我们的印象笔记私有邮箱:每一个用户都有一个属于自己的独一无二的邮箱地址,而转发或者抄送到这个独一无二的地址之后,这封邮件就会自动出现在我们的默认笔记本中. 2.如何找到自己的印象笔记私有邮箱地址? (1)Mac 客户端:

  • 中望CAD教程第二章:中望CAD设置

    中望CAD教程第二章:中望CAD设置 中望CAD教程之使用缺省设置 当用户单击图2-1所示的启动对话框中的 按钮时,中望CAD 2010将让用户使用缺省的绘图环境开始绘制新图,如图2-4所示.该对话框中的默认设置框中有两个单选框:英制(英尺和英寸),公制(毫米).用户选择其中一项后,单击确定按钮,即可开始绘制新图形.更多>> 中望CAD教程之使用样板图向导 样板图是指包含一定绘图环境,但未绘任何图形的实体文件.使用样板图的特点是不仅可以使用它所定义的绘图环境,而且可以使用它所包含的图样数据,以

  • Java中的Timer和TimerTask在Android中的用法

    在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. Timer是一个普通的类,其中有几个重要的方法:而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作. schedule方法有三个参数 第一个参数就是TimerTask类型的对象

  • php中使用gd库实现下载网页中所有图片 php中使用gd库实现下载网页中所有图片

    这篇文章主要介绍了php中使用gd库实现下载网页中所有图片,本文直接给出实现代码,需要的朋友可以参考下 在前期的php教程就讲了php gd库可以实现远程图片的下载,但是那只是下载了一张图片,原理是一样的,要想下载一个网页的所有图片只要使用正则表达式进行判断,找出所有的图片url就可以进行循环下载了,我特地参照网络资源编写了gd库图片下载类! php代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

  • PHP中把错误日志保存在系统日志中 PHP中把错误日志保存在系统日志中

    这篇文章主要介绍了PHP中把错误日志保存在系统日志中(Windows系统),本文讲解了设置方法和查看方法,需要的朋友可以参考下 [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: 复制代码 代码如下: error_log = syslog 或者在运行时使用 ini_set() 函数设置. [例1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php //关闭错误显示 ini_set('display_errors',

  • 中移动改革飞信运营模式 华为中软国际现身竞标

    过去的6年中,中国移动旗下的移动互联网业务飞信取得了让业界羡慕的成绩,与中移动合作的飞信业务独家运营方神州泰岳就曾经赚得盆满钵溢.但随着更多即时通讯移动应用的快速崛起,飞信正失去昔日光芒.现实的竞争压力之下,中移动不得不操刀改革飞信的旧运营模式,引入新的合作伙伴和市场化机制. 新竞标者华为.中软国际 不紧不慢的调整是央字号国企试图扭转被动局面的一贯做法,中移动为应对来自互联网OTT业务的冲击开始计划重构飞信,启动新的飞信服务商招标便是其计划的第一步.根据中移动广东公司发布的最新招标公告显示,中移

  • Win7系统中让垃圾邮件不再进入Outlook中的设置技巧 Win7系统中让垃圾邮件不再进入Outlook中的设置技巧

    Outlook 是 Microsoft 的主打邮件传输和协作客户端产品.它是一种集成到Microsoft Office和ExchangeServer中的独立应用程序.Outlook 还提供与Internet Explorer 5.5的交互和集成.电子邮件.日历和联系人管理等功能的完全集成使得 Outlook 成为许多商业用户眼中完美的客户端. Outlook 可帮助您查找和组织信息,以便您可以无缝地使用 Office 应用程序.这有助于您更有效地交流和共享信息.下面小编给大家介绍Win7系统 (

  • 开机出现服务器正在运行中由于另一个程序正在运行中怎么办? 开机出现服务器正在运行中由于另一个程序正在运行中怎么办?

    为什么开机后就出现"服务器正在运行中由于另一个程序正在运行中,此操作无法完成.请选择"切换到"来激活正在运行中的程序,并更正问题",需要点击多次"切换到"才能使这个对话框消失,电脑也不能进入正常的运行,奇怪了,今天小编就自己的亲身经历来交大家如何解决. 1.crtl+alt+del调用windows任务管理器 2.然后,文件-新建任务运行 3.输入msconfig.msc 4.然后禁用里面的所有开机启动项 5.接着重启一下电脑,启动起来时候就不会

  • 记住, 生活中没有过不去的难关, 生命中也没有离不开的人 记住, 生活中没有过不去的难关, 生命中也没有离不开的人

    你忙,我可以理解-- 你和别人聊天,我也理解- 你聊完了删除所有信息,我依然可以理解-- 可是,万一,有一天我在你的世界消失了--- 那么请你也理解-- 渐渐明白了,太在乎一个人往往会伤害自己: 渐渐明白了,很多爱情是可遇而不可求的: 渐渐明白了,很多东西只能拥有一次,放手了也就意味着失去: 渐渐明白了,最在乎的那个人,往往是最容易让你流泪的: 渐渐明白了,真心对一个人是不需要回报的: 一件事你期望的高了, 你就输了: 一份情你付出的多了, 你就累了: 一个人你等的久了, 你就痛了. 记住, 生

  • 在win7中整理磁盘碎片后文件夹中出现乱码怎么办? 在win7中整理磁盘碎片后文件夹中出现乱码怎么办?

    其实很多朋友都会在电脑操作中涉及到整理磁盘碎片,因为咱们操作电脑的时间越久,那么磁盘中出现的碎片也就相应的越多,久而久之,便会造成磁盘运行变慢,因此,磁盘碎片整理是咱们定期定时需要做的事情,这也是win7旗舰版64位系统下载系统优化的一项重要工作.不过最近却有朋友在执行这项优化工作的时候发现了一个奇怪的现象,什么现象?该网友说,在win7旗舰版中整理磁盘碎片后文件夹中出现乱码,这样会导致磁盘中的很多文件夹都无法正常使用,那么出现这样的问题,我们要如何解决呢?下面,就让小编来详细的介绍一下吧! 1

  • 在DIV CSS的网页中,如果下载用于CSS样式中的背景图片?

    在DIV CSS的网页中,如果下载用于CSS样式中的背景图片?有些背景图片是PNG格式的.我试用过其它一些浏览器,但都只是下载页面中的图片,样式表中的背景图片下载不下来,到页面中直接下载另存为也不行.求助高手给于只招?谢谢了! 最佳答案 大多数显示的背景都可以通过右键-背景另存为保存下来,你存不下来可能有几点原因: 1.鼠标没有点对位置 2.代码结构影响,这就很多种情况了 如果就是存不下来,你可以保存他的样式表,或者查看样式表,结合源文件代码中class或者id引用的样式名,搜索到这个样式,看一

  • php中把session保存到MySQL数据库中示例

    下面这个例子是利用了php中的session_set_save_handler函数保存到数据库中,这个有点像小编写的购物车原理了,下面来看看这个例子,希望对各位有帮助. PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题.

  • php中fgetcsv函数在php5.2.8 中的数据不完整

    本文章来给各位同学介绍一下关于php中fgetcsv函数在php5.2.8 中的数据不完整问题解决办法,希望此文章对各位朋友会有所帮助. 问题解析出来的数据不完整,有为空的字段 网上查了下说是在php5.2.8 中存在bug 解决办法是使用自定义函数 代码如下 复制代码 function __fgetcsv(& $handle, $length = null, $d = ',', $e = '"') { $d = preg_quote($d); $e = preg_quote($e);

  • linux中apache和mysqld加入service系统服务中

    本文章来给各位同学详细介绍linux中apache和mysqld加入service系统服务中具体操作命令,有需要了解的同学不防参考一下 先我们把mysql增加到linux的系统服务中去 mysql: 代码如下 复制代码 cd /usr/local/mysql/share/mysql cp mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on service mysqld restart 现在你就可以使

  • WPF中使用定时器 DispatcherTimer 干TCP连接中的心跳 HeartBeat

    WPF中使用定时器 DispatcherTimer 做TCP连接中的心跳 HeartBeat 开发过程中经常遇到定时触发的需求,如:TCP/IP连接中,使用心跳包保持连接或检测连接是否已经中断. WPF中有多种定时器: 1.using System.Windows.Threading; 代码如下: using System.Windows.Threading; public partial class MainWindow : Window { DispatcherTimer timerHear

  • informix存储过程中调用shell的疑问,求解中,先谢了解决办法

    informix存储过程中调用shell的疑问,求解中,先谢了 各位高手,我写了一个informix存储过程,过程中调用一个shell,但是调用时总报错: " System command cannot be executed. 更多例外 ... ISAM error: no primary key " 本人的过程如下: create procedure proc_Interface_k81_test() returning int, int, varchar( 254 ); defi

  • 为什么SQL中的这段程序在VFP中执行不了解决办法 为什么SQL中的这段程序在VFP中执行不了解决办法

    为什么SQL中的这段程序在VFP中执行不了 --cut-- 本帖最后由 dkfdtf 于 2014-05-27 16:07:22 编辑 跟你在查询分析器中运行的命令格式一样就行了 sqlexec(thisform.connhandle, "exec sf_图书借阅") --cut-- 用这个追踪一下嘛

  • Android逆向之旅-Android中怎么获取在非Root设备中获取应用隐私数据 Android逆向之旅-Android中怎么获取在非Root设备中获取应用隐私数据

    Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据 一.前言 今天在开发的过程中遇到一个问题,就是关于AndroidManifest.xml中的allowBackup属性,也算是自己之前对这个属性的不了解,加上IDE的自动生成代码,没太注意这个属性,但是没想到这个属性会直接导致隐私数据的丢失.下面就来看一下这个属性的影响到底有多大.他的作用是什么? 二.Android中的allowBackup属性 1.allowBackup安全风险描述 Android API

最新文章
  • 又不会发 Gist 了

    --cut--

  • 付出与回报完全不成比例?

    刚才翻了一下delicious书签,发现收藏Smaller的有一百多人,而收藏Mou的居然有两千多. http://delicious.com/url/?url=smallerapp.com http://delicious.com/url/?url=mouapp.com 这跟我的预期完全相反- Smaller的第一个public release花费了4个月的时间,是Mou的四倍.投入的精力更多,细节考虑的也比较多,而且我觉得Smaller更常用啊,按说应该比Mou更流行,可结果完全相反! 这就

  • 有没有类似微信这样,网页版的,进行语音发送的开源项目

    关键是象微信语音这样传送 --cut-- ihacku在2014-01-19 12:50:0回答到: 在Github搜搜WebRTC 直接符合你描述的估计没有 但是可以复用的代码是有的

  • win10怎么切换账户 win10怎么切换账户

    点击开始菜单按钮,点击用户名,再点击要切换的账户名称即可.

  • Photoshop制作精致大气的绿色网页按钮教程 Photoshop制作精致大气的绿色网页按钮教程

    来源:站酷 作者:酷头儿 对于各界交互界面大师来说,按钮的制作无疑是不可缺少的一个组成部分,但是习惯于运用多个图层叠加出非常漂亮的效果的时候,修改极不方便.下面介绍如何用图形渐变及图层样式简化这些图层. 最终效果 1.新建大小自定的文档,背景填充青色.先用钢笔建立路径,如下图. 2.创建渐变调整图层,渐变颜色位置随意,如下图. 3.给当前图层添加图层样式,选择投影,效果如下图. 4.设置内阴影,这里省去了文字下方的投影部分,以内阴影代替(注意曲线与数据的变换),数据一定要调试之后再确定. 5.设

  • 2016年母亲节怎么尽孝心 2016年母亲节怎么尽孝心

    2016年母亲节怎么尽孝心 每年的5月第二周是母亲节,如果没人提醒你,你会记起来吗?这是一个温馨的日子,再忙也要抽出时间陪陪亲爱的妈妈,即使不能回家看看,也要给她送去儿女的一份浓浓的祝福. 如果说因为忙碌和粗心,我们平时忽略了对母亲的问候和关心,为亲爱的她做点什么呢?以下我们给您出的点子: 1.为"家务型"妈妈做顿晚餐 温馨指数:★★★★☆ 大多数的母亲总是为家务操劳,那么今天是不是该让她丢开围裙,去做自己一直想做,但总是苦于没有时间.精力去做的事呢?暂时放下你手中的工作吧,让妈妈过一

  • 三星GALAXY三新机何时上市 三星GALAXY三新机何时上市

    三星旗下向来机型众多,尚未发布的相机手机GALAXY S4 Zoom.防水版GALAXY S4 Active以及GALAXY S4 mini等多款新机将在何时登场更是备受期待.日前,来自国外网站SamMobile的消息为我们披露了三星数款新机在欧洲市场发布的时间,同时包括相机手机GALAXY S4 Zoom.防水版GALAXY S4 Active以及GALAXY S4 mini等三款新机则被爆料将于本月月底正式发布. GALAXY Mega系列率先登场 尽管新机发布将是人们关心的话题,但在本月率

  • 新手容易忽视的外链问题(外链篇)

    1.外链条数是否能效果更大? 很多SEOer在操作网站的时候,第一步就是查看竞争对手的外链,一看,几万条,虚了.就没用勇气继续做下去,但真的如果仔细一看,一部分的网站外接都是来自一个网站的.根本没有核心竞争力可言.完全可以依靠垃圾站来堆积这些"虚张声势"的外链.但是作用微乎其微. 本人曾经做过一个实验,用了2个试用站,同一个关键词,观察了2个月.第一个站花了500元左右购买了10个收录超过两万以上的垃圾站全站链接,当然,是缓慢增加.不出所料,1个半月之后,外链大概浮动在9380左右.但

  • 善意的谎言作文550字

    善意的谎言作文550字[1] 谎言,也分善与恶的,像许多事物一样具有两面性的,有好的一面,也有坏的一面.每个人或多或少都会遇到善意的谎言,我也一样,你也是. 我三岁那年,第一天上幼儿园.那天,风和日丽,晴空万里,可正当我迈出家门时,一阵凉风袭来,我不禁得打了个喷嚏:"哈......啾!"我伸出手让妈妈将我抱了起来,搂着妈妈,我到了幼儿园门口.妈妈把我放了下来,我自己朝里面走去.但是,一到门口我就停下了脚步,望了望里面,又回头望了望妈妈,不走了."怎么了?"妈妈走上前

  • 酷派发布大观4与智能手表 配备Tegra 4四核处理器 酷派发布大观4与智能手表 配备Tegra 4四核处理器

    9月23日下午,酷派全新一代大观系列新作酷派大观4正式在京发布.该机采用5.9英寸视网膜屏幕,配备NVIDIA Tegra 4四核处理器,同期亮相的还有酷派旗下首款智能手表. 酷派大观4是酷派大观系列的新款旗舰机型,定位于高端商务用户.酷派大观4采用了航空材质一体成型设计,坚固结实,亮光与磨砂的双表面层很好的凸显了金属的质感美.而且大观4还克服了金属材质干扰信号的问题,通话质量得到了极大的保障. 除了一体成型的金属机身外,酷派大观4还搭载了一块5.9英寸由夏普生产的最高级CGS高清屏幕,分辨率为

热门推荐