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 相关文章推荐
获取3个数组不重复的值的具体实现
Dec 30 Javascript
js获取当前地址 JS获取当前URL的示例代码
Feb 26 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
JQuery实现定时刷新功能代码
May 09 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
使用Node.js实现一个多人游戏服务器引擎
Mar 13 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
Apr 17 Javascript
Node 代理访问的实现
Sep 19 Javascript
使用Vue实现简单计算器
Feb 25 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的ob_start();控制您的浏览器cache!
2006/11/25 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
JavaScript 应用类库代码
2008/06/02 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
js实现碰撞检测
2021/01/29 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Python版的文曲星猜数字游戏代码
2013/09/02 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python中的TCP socket写法示例
2018/05/11 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
Python如何输出警告信息
2020/07/30 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
保密工作责任书
2014/04/16 职场文书
1000字打架检讨书
2014/11/03 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python