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高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 Javascript
vue之nextTick全面解析
May 17 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
JS实现网页抢购功能(触发,终止脚本)
Nov 27 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
Vue.js实现的表格增加删除demo示例
May 22 Javascript
vuex提交state&&实时监听state数据的改变方法
Sep 16 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 jQuery
微信小程序下拉菜单效果的实例代码
May 14 Javascript
Vue通过懒加载提升页面响应速度
May 10 Vue.js
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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
Python元组知识点总结
2019/02/18 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
django有哪些好处和优点
2020/09/01 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
给排水工程师岗位职责
2013/11/21 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
会议主持词结束语
2015/07/03 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技