Express框架之connect-flash詳解

第一步:咱們首先來看看這個插件的使用javascript

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. var flash = require('connect-flash');  
  2. app.use(flash());//Express使用這個插件  

第二步:咱們看看其內部是如何實現的java

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. var format = require('util').format;  
  2. var isArray = require('util').isArray;  

依賴的模塊爲node.js的核心模塊utilnode

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. module.exports = function flash(options) {  
  2.   options = options || {};  
  3.   //若是用戶沒有指定unsafe參數,那麼safe就是true;不然若是用戶指定了unsafe爲false那麼safe就是true  
  4.   //也就是說這個插件只能指定一個配置項就是unsafe,默認不指定爲就是安全的!  
  5.   var safe = (options.unsafe === undefined) ? true : !options.unsafe;  
  6.   return function(req, res, next) {  
  7.     //若是req.flash存在,同時是safe的那麼直接調用下面一個插件,這個插件就不執行了  
  8.     if (req.flash && safe) { return next(); }  
  9.     //若是上面的條件不知足那麼爲req指定flash屬性,其值爲下面的_flash函數  
  10.     req.flash = _flash;  
  11.     next();  
  12.   }  
  13. }  
 

很顯然,咱們看到能夠傳入options參數,若是沒有指定unsafe那麼unsafe就是true,此時safe就是false。若是用戶明確指定了unsafe爲false那麼safe爲true,若是明確指定了unsafe爲false那麼safe就是true。若是safe爲true那麼直接調用下面一箇中間件。數組

咱們如今看看req對象的flash方法是怎麼樣的:安全

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. function _flash(type, msg) {  
  2.   //若是當前req對象沒有session域,那麼拋出錯誤  
  3.   if (this.session === undefined) throw Error('req.flash() requires sessions');  
  4.   //爲req.session.flash指定一個域,默認爲空對象  
  5.   var msgs = this.session.flash = this.session.flash || {};  
  6.   if (type && msg) {  
  7.     // util.format is available in Node.js 0.6+  
  8.     //若是當前是Node.js 0.6+以上的環境,同時傳入的參數有兩個以上  
  9.     if (arguments.length > 2 && format) {  
  10.       var args = Array.prototype.slice.call(arguments, 1);  
  11.       //獲取第二個參數之後的數組  
  12.       msg = format.apply(undefined, args);  
  13.       //msg保存的是第二個參數之後的值,並對這個值進行了format處理  
  14.     } else if (isArray(msg)) {  
  15.       msg.forEach(function(val){  
  16.         (msgs[type] = msgs[type] || []).push(val);  
  17.       });  
  18.       return msgs[type].length;  
  19.       //若是傳入的第二個參數是一個數組,那麼所有把數據綁定到req.session.flash域裏面,其中數據類型爲{'info':['school','home']}  
  20.       //而後返回的是特定的長度  
  21.     }  
  22.     //若是參數很少於2,同時msg也不是數組,那麼把msg添加到req.session.flash中而後返回  
  23.     return (msgs[type] = msgs[type] || []).push(msg);  
  24.   } else if (type) {  
  25.     //若是沒有指定msg,僅僅指定了type,這時候咱們獲取到req.session.flash中特定類型的數據,同時把數據從req.session.flash中刪除  
  26.     var arr = msgs[type];  
  27.     delete msgs[type];  
  28.     return arr || [];  
  29.   } else {  
  30.     //若是調用方式如flash()也就是不傳入任何參數,這時候直接清空了req.session.flash中的數據  
  31.     this.session.flash = {};  
  32.     return msgs;  
  33.   }  
  34. }  

(1)若是傳入的參數多於兩個,那麼首先獲取第二個以及之後的參數,而後對第二個之後的參數進行format操做,最後把數據封裝到req.session.flash中,同時返回session

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. req.flash('info', 'email has been sent to %s.', userName);  

(2)若是傳入的第二個參數是一個數組,那麼把這個數組每個元素封裝到req.session.flash中,而後返回特定type的數據的長度app

(3)不然若是僅僅傳入了type表示獲取指定類型的數據而後返回,並把數據從req.session.flash中刪除(這樣只要咱們調用這個方法獲取了數據那麼就從session中刪除了)函數

 

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. req.flash('info', 'email sent');  
  2.  req.flash('error', 'email delivery failed');  
  3.  req.flash('info', 'email re-sent');  
  4. req.flash('info');  
  5. // => ['email sent', 'email re-sent']  
  6. req.flash('info');  
  7. // => []這時候info已經清空了  

(4)若是用戶沒有傳入任何參數那麼清空req.session.flash域,可是返回的是原來的局部變量保存到的req.session.flash對象ui

[javascript] view plain copy 在CODE上查看代碼片派生到個人代碼片
  1. else {  
  2.     //若是調用方式如flash()也就是不傳入任何參數,這時候直接清空了req.session.flash中的數據  
  3.     this.session.flash = {};  
  4.     return msgs;  
  5.   }  

這個插件通常和redirect一塊兒使用,保證在渲染下一個頁面的時候數據可用。this

 

 

以爲有用的小夥伴門幫忙掃一下二維碼,謝謝!

相關文章
相關標籤/搜索