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 jsFiddle JSBin在线调试器
Mar 14 Javascript
json格式化/压缩工具 Chrome插件扩展版
May 25 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
细说javascript函数从函数的构成开始
Aug 29 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
Nov 17 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
Jan 23 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
对angular4子路由&辅助路由详解
Oct 09 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 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 session 错误
2009/05/21 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python兔子毒药问题实例分析
2015/03/05 Python
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
python字符串的拼接方法总结
2019/11/18 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python制作微博图片爬取工具
2021/01/16 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
servlet面试题
2012/08/20 面试题
化学专业毕业生求职信
2014/07/28 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
党员转正意见怎么写
2015/06/03 职场文书
二年级数学教学反思
2016/02/16 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript
python解析照片拍摄时间进行图片整理
2022/07/23 Python