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 验证浏览器是否支持javascript的方法小结
May 17 Javascript
在javascript中创建对象的各种模式解析
May 16 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
Aug 13 Javascript
js中对象和面向对象与Json介绍
Jan 21 Javascript
Vue 实现一个命令式弹窗组件功能
Sep 25 Javascript
使用node.JS中的url模块解析URL信息
Feb 06 Javascript
Node.js API详解之 Error模块用法实例分析
May 14 Javascript
使用webpack和rollup打包组件库的方法
Feb 25 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 MYSQL中插入当前时间
2008/04/06 PHP
php eval函数用法总结
2012/10/31 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
如何在PHP中读写文件
2020/09/07 PHP
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
利用Python实现图书超期提醒
2016/08/02 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
电子商务优秀毕业生求职信
2014/07/11 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python