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 相关文章推荐
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
让JavaScript和其它资源并发下载的方法
Oct 16 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
javascript模拟C#格式化字符串
Aug 26 Javascript
node.js require() 源码解读
Dec 13 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
Jan 21 Javascript
javascript动态获取登录时间和在线时长
Feb 25 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
JavaScript中立即执行函数实例详解
Nov 04 Javascript
vue实现登录拦截
Jun 29 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
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/12/06 PHP
PHP 实用代码收集
2010/01/22 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
大学生校园创业计划书
2014/02/08 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
创业女性典型材料
2014/05/02 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers