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 相关文章推荐
关于 byval 与 byref 的区别分析总结
Oct 08 Javascript
javascript 写类方式之七
Jul 05 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
Apr 05 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 Javascript
React学习笔记之事件处理(二)
Jul 02 Javascript
JS 实现分页打印功能
May 16 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 18 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
数字转英文
2006/12/06 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
简单实现php上传文件功能
2017/09/21 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
js中日期的加减法
2015/05/06 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
从0开始的Python学习016异常
2019/04/08 Python
在python中用url_for构造URL的方法
2019/07/25 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
应届生的求职推荐信范文
2013/11/30 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
保安公司服务承诺书
2014/05/28 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
黄山导游词
2015/01/31 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python