Express框架之connect-flash详解


Posted in Javascript onMay 31, 2017

第一步:我们首先来看看这个插件的使用

var flash = require('connect-flash'); 
app.use(flash());//Express使用这个插件

第二步:我们看看其内部是如何实现的

var format = require('util').format; 
var isArray = require('util').isArray;

依赖的模块为node.js的核心模块util

module.exports = function flash(options) { 
 options = options || {}; 
 //如果用户没有指定unsafe参数,那么safe就是true;否则如果用户指定了unsafe为false那么safe就是true 
 //也就是说这个插件只能指定一个配置项就是unsafe,默认不指定为就是安全的! 
 var safe = (options.unsafe === undefined) ? true : !options.unsafe; 
 return function(req, res, next) { 
  //如果req.flash存在,同时是safe的那么直接调用下面一个插件,这个插件就不执行了 
  if (req.flash && safe) { return next(); } 
  //如果上面的条件不满足那么为req指定flash属性,其值为下面的_flash函数 
  req.flash = _flash; 
  next(); 
 } 
}

很显然,我们看到可以传入options参数,如果没有指定unsafe那么unsafe就是true,此时safe就是false。如果用户明确指定了unsafe为false那么safe为true,如果明确指定了unsafe为false那么safe就是true。如果safe为true那么直接调用下面一个中间件。

我们现在看看req对象的flash方法是怎么样的:

function _flash(type, msg) { 
 //如果当前req对象没有session域,那么抛出错误 
 if (this.session === undefined) throw Error('req.flash() requires sessions'); 
 //为req.session.flash指定一个域,默认为空对象 
 var msgs = this.session.flash = this.session.flash || {}; 
 if (type && msg) { 
  // util.format is available in Node.js 0.6+ 
  //如果当前是Node.js 0.6+以上的环境,同时传入的参数有两个以上 
  if (arguments.length > 2 && format) { 
   var args = Array.prototype.slice.call(arguments, 1); 
   //获取第二个参数以后的数组 
   msg = format.apply(undefined, args); 
   //msg保存的是第二个参数以后的值,并对这个值进行了format处理 
  } else if (isArray(msg)) { 
   msg.forEach(function(val){ 
    (msgs[type] = msgs[type] || []).push(val); 
   }); 
   return msgs[type].length; 
   //如果传入的第二个参数是一个数组,那么全部把数据绑定到req.session.flash域里面,其中数据类型为{'info':['school','home']} 
   //然后返回的是特定的长度 
  } 
  //如果参数不多于2,同时msg也不是数组,那么把msg添加到req.session.flash中然后返回 
  return (msgs[type] = msgs[type] || []).push(msg); 
 } else if (type) { 
  //如果没有指定msg,仅仅指定了type,这时候我们获取到req.session.flash中特定类型的数据,同时把数据从req.session.flash中删除 
  var arr = msgs[type]; 
  delete msgs[type]; 
  return arr || []; 
 } else { 
  //如果调用方式如flash()也就是不传入任何参数,这时候直接清空了req.session.flash中的数据 
  this.session.flash = {}; 
  return msgs; 
 } 
}

(1)如果传入的参数多于两个,那么首先获取第二个以及以后的参数,然后对第二个以后的参数进行format操作,最后把数据封装到req.session.flash中,同时返回。

req.flash('info', 'email has been sent to %s.', userName);

(2)如果传入的第二个参数是一个数组,那么把这个数组每一个元素封装到req.session.flash中,然后返回特定type的数据的长度

(3)否则如果仅仅传入了type表示获取指定类型的数据然后返回,并把数据从req.session.flash中删除(这样只要我们调用这个方法获取了数据那么就从session中删除了)

req.flash('info', 'email sent'); 
 req.flash('error', 'email delivery failed'); 
 req.flash('info', 'email re-sent'); 
req.flash('info'); 
// => ['email sent', 'email re-sent'] 
req.flash('info'); 
// => []这时候info已经清空了

(4)如果用户没有传入任何参数那么清空req.session.flash域,但是返回的是原来的局部变量保存到的req.session.flash对象

else { 
  //如果调用方式如flash()也就是不传入任何参数,这时候直接清空了req.session.flash中的数据 
  this.session.flash = {}; 
  return msgs; 
 }

这个插件一般和redirect一起使用,保证在渲染下一个页面的时候数据可用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用javascript创建快捷方式的简单实例
Aug 09 Javascript
JS批量操作CSS属性详细解析
Dec 16 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
Jan 26 Javascript
动态加载JavaScript文件的两种方法
Apr 22 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
js实现图片淡入淡出切换简易效果
Aug 22 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
javascript+html5+css3自定义弹出窗口效果
Oct 26 Javascript
mint-ui 时间插件使用及获取选择值的方法
Feb 09 Javascript
jQuery实现雪花飘落效果
Aug 02 jQuery
JS前端轻量fabric.js系列物体基类
Aug 05 Javascript
node.js中express-session配置项详解
May 31 #Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 #Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 #Javascript
JS简单实现自定义右键菜单实例
May 31 #Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 #Javascript
基于react框架使用的一些细节要点的思考
May 31 #Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
May 31 #Javascript
You might like
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
Yii快速入门经典教程
2015/12/28 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
JavaScript按位运算符的应用简析
2014/02/04 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
对Django外键关系的描述
2019/07/26 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
Django之路由层的实现
2019/09/09 Python
python可视化实现KNN算法
2019/10/16 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
平面设计的岗位职责
2013/11/08 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
幼儿园教师工作感言
2014/02/15 职场文书
活动宣传策划方案
2014/05/23 职场文书
三问三解心得体会
2014/09/05 职场文书
运动会200米广播稿
2015/08/19 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Redis集群的关闭与重启操作
2021/07/07 Redis
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android