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 在各个浏览器中执行的耐性
Apr 06 Javascript
firefo xml 读写实现js代码
Jun 11 Javascript
JSON 数据格式介绍
Jan 13 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
jQuery CSS()方法改变现有的CSS样式表
Sep 09 Javascript
详解JavaScript时间格式化
Dec 23 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
Javascript 实现放大镜效果实例详解
Dec 03 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
JS拉起或下载app的实现代码
Feb 22 Javascript
Nautil 中使用双向数据绑定的实现
Oct 02 Javascript
React Native项目框架搭建的一些心得体会
May 28 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
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
Python中的并发编程实例
2014/07/07 Python
python中偏函数partial用法实例分析
2015/07/08 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
心理健康教育心得体会
2013/12/29 职场文书
小学语文教研活动总结
2014/07/01 职场文书
2014年内勤工作总结
2014/11/24 职场文书
2014年党务工作总结
2014/11/25 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python