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 相关文章推荐
IE 当eval遇上function的处理
Aug 09 Javascript
js获取系统的根路径实现介绍
Sep 08 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
Jan 11 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
微信小程序template模版的使用方法
Apr 13 Javascript
微信小程序云开发 生成带参小程序码流程
May 18 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
js 计算月/周的第一天和最后一天代码
Feb 01 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
详解Javascript事件驱动编程
2016/01/03 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
深入理解python对json的操作总结
2017/01/05 Python
python3中函数参数的四种简单用法
2018/07/09 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python turtle 绘制太极图的实例
2019/12/18 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
5款实用的python 工具推荐
2020/10/13 Python
介绍一下Java的安全机制
2012/06/28 面试题
小学社团活动总结
2014/06/27 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
python scrapy简单模拟登录的代码分析
2021/07/21 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python