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避免数字计算精度误差的方法详解
Mar 05 Javascript
通过$(this)使用jQuery包装后的方法或属性
May 18 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
微信JSSDK上传图片
Aug 23 Javascript
jquery中val()方法是从最后一个选项往前读取的
Sep 06 Javascript
浅析BootStrap模态框的使用(经典)
Apr 29 Javascript
关于动态执行代码(js的Eval)实例详解
Aug 15 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 Javascript
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
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之第七天
2006/10/09 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
jQuery 入门讲解1
2009/04/15 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
js同源策略详解
2015/05/21 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
运动会邀请函范文
2014/01/31 职场文书
教师考核评语
2014/04/28 职场文书
学生党员公开承诺书
2014/05/28 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
2014统计局民主生活会对照检查材料思想汇报
2014/10/02 职场文书
小学生成绩单评语
2014/12/31 职场文书
退伍军人感言
2015/08/01 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python
MySQL Server层四个日志的实现
2022/03/31 MySQL