第一步:我们首先来看看这个插件的使用

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) "htmlcode">
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一起使用,保证在渲染下一个页面的时候数据可用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?