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高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
May 23 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
Angular路由简单学习
Dec 26 Javascript
JavaScript简单生成 N~M 之间随机数的方法
Jan 13 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
angular 服务随记小结
May 06 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
mysql数据库差异比较的PHP代码
2012/02/05 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
PHP attributes()函数讲解
2019/02/03 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python实现句子翻译功能
2017/11/14 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
python实现的生成word文档功能示例
2019/08/23 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
波兰珠宝品牌:YES
2019/08/09 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
大一自我鉴定范文
2013/12/27 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript