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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
用js实现计算代码行数的简单方法附代码
Aug 13 Javascript
jQuery中closest和parents的区别分析
May 07 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
jQuery中页面返回顶部的方法总结
Dec 30 Javascript
jQuery中绑定事件bind() on() live() one()的异同
Feb 23 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
Webpack实现按需打包Lodash的几种方法详解
May 08 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
JavaScript常用事件介绍
Jan 21 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
Aug 27 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/10/09 PHP
PHP入门
2006/10/09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
PHP asXML()函数讲解
2019/02/03 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
python 实现线程之间的通信示例
2020/02/14 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
Python ATM功能实现代码实例
2020/03/19 Python
python多线程和多进程关系详解
2020/12/14 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
客服实习的个人自我鉴定
2013/10/20 职场文书
父母对孩子说的话
2014/04/12 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
节水标语大全
2014/06/11 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
司考复习计划
2015/01/19 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
解析Java中的static关键字
2021/06/14 Java/Android