Express框架之connect-flash詳解
第一步:我們首先來看看這個插件的使用
var flash = require('connect-flash');
app.use(flash());//Express使用這個插件
第二步:我們看看其內(nèi)部是如何實現(xiàn)的
var format = require('util').format;
var isArray = require('util').isArray;
依賴的模塊為node.js的核心模塊util
module.exports = function flash(options) {
options = options || {};
//如果用戶沒有指定unsafe參數(shù),那么safe就是true;否則如果用戶指定了unsafe為false那么safe就是true
//也就是說這個插件只能指定一個配置項就是unsafe,默認(rèn)不指定為就是安全的!
var safe = (options.unsafe === undefined) ? true : !options.unsafe;
return function(req, res, next) {
//如果req.flash存在,同時是safe的那么直接調(diào)用下面一個插件,這個插件就不執(zhí)行了
if (req.flash && safe) { return next(); }
//如果上面的條件不滿足那么為req指定flash屬性,其值為下面的_flash函數(shù)
req.flash = _flash;
next();
}
}
很顯然,我們看到可以傳入options參數(shù),如果沒有指定unsafe那么unsafe就是true,此時safe就是false。如果用戶明確指定了unsafe為false那么safe為true,如果明確指定了unsafe為false那么safe就是true。如果safe為true那么直接調(diào)用下面一個中間件。
我們現(xiàn)在看看req對象的flash方法是怎么樣的:
function _flash(type, msg) {
//如果當(dāng)前req對象沒有session域,那么拋出錯誤
if (this.session === undefined) throw Error('req.flash() requires sessions');
//為req.session.flash指定一個域,默認(rèn)為空對象
var msgs = this.session.flash = this.session.flash || {};
if (type && msg) {
// util.format is available in Node.js 0.6+
//如果當(dāng)前是Node.js 0.6+以上的環(huán)境,同時傳入的參數(shù)有兩個以上
if (arguments.length > 2 && format) {
var args = Array.prototype.slice.call(arguments, 1);
//獲取第二個參數(shù)以后的數(shù)組
msg = format.apply(undefined, args);
//msg保存的是第二個參數(shù)以后的值,并對這個值進(jìn)行了format處理
} else if (isArray(msg)) {
msg.forEach(function(val){
(msgs[type] = msgs[type] || []).push(val);
});
return msgs[type].length;
//如果傳入的第二個參數(shù)是一個數(shù)組,那么全部把數(shù)據(jù)綁定到req.session.flash域里面,其中數(shù)據(jù)類型為{'info':['school','home']}
//然后返回的是特定的長度
}
//如果參數(shù)不多于2,同時msg也不是數(shù)組,那么把msg添加到req.session.flash中然后返回
return (msgs[type] = msgs[type] || []).push(msg);
} else if (type) {
//如果沒有指定msg,僅僅指定了type,這時候我們獲取到req.session.flash中特定類型的數(shù)據(jù),同時把數(shù)據(jù)從req.session.flash中刪除
var arr = msgs[type];
delete msgs[type];
return arr || [];
} else {
//如果調(diào)用方式如flash()也就是不傳入任何參數(shù),這時候直接清空了req.session.flash中的數(shù)據(jù)
this.session.flash = {};
return msgs;
}
}
(1)如果傳入的參數(shù)多于兩個,那么首先獲取第二個以及以后的參數(shù),然后對第二個以后的參數(shù)進(jìn)行format操作,最后把數(shù)據(jù)封裝到req.session.flash中,同時返回。
req.flash('info', 'email has been sent to %s.', userName);
(2)如果傳入的第二個參數(shù)是一個數(shù)組,那么把這個數(shù)組每一個元素封裝到req.session.flash中,然后返回特定type的數(shù)據(jù)的長度
(3)否則如果僅僅傳入了type表示獲取指定類型的數(shù)據(jù)然后返回,并把數(shù)據(jù)從req.session.flash中刪除(這樣只要我們調(diào)用這個方法獲取了數(shù)據(jù)那么就從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已經(jīng)清空了
(4)如果用戶沒有傳入任何參數(shù)那么清空req.session.flash域,但是返回的是原來的局部變量保存到的req.session.flash對象
else {
//如果調(diào)用方式如flash()也就是不傳入任何參數(shù),這時候直接清空了req.session.flash中的數(shù)據(jù)
this.session.flash = {};
return msgs;
}
這個插件一般和redirect一起使用,保證在渲染下一個頁面的時候數(shù)據(jù)可用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 從零開始學(xué)習(xí)Node.js系列教程之基于connect和express框架的多頁面實現(xiàn)數(shù)學(xué)運算示例
- 解決Node.js使用MySQL出現(xiàn)connect ECONNREFUSED 127.0.0.1:3306的問題
- Node.js connect ECONNREFUSED錯誤解決辦法
- NodeJS學(xué)習(xí)筆記之Connect中間件應(yīng)用實例
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(二)
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(一)
- 分析Node.js connect ECONNREFUSED錯誤
相關(guān)文章
Node.js實現(xiàn)爬取網(wǎng)站圖片的示例代碼
本文將利用Node.js開發(fā)一個小示例—爬取某圖片網(wǎng)站的圖片,文中涉及的知識點有https模塊、cheerio模塊、fs模塊和閉包,感興趣的可以了解一下2022-04-04
使用nodeJS中的fs模塊對文件及目錄進(jìn)行讀寫,刪除,追加,等操作詳解
nodeJS中fs模塊對系統(tǒng)文件及目錄進(jìn)行讀寫操作,本文將詳細(xì)介紹nodejs中的文件操作模塊fs的使用方法2020-02-02
Nodejs實現(xiàn)的一個靜態(tài)服務(wù)器實例
這篇文章主要介紹了Nodejs實現(xiàn)的一個靜態(tài)服務(wù)器實例,本文實現(xiàn)的靜態(tài)服務(wù)器實例包含cache功能、壓縮功能等,需要的朋友可以參考下2014-12-12
Node在Controller層進(jìn)行數(shù)據(jù)校驗的過程詳解
這篇文章主要給大家介紹了關(guān)于Node在Controller層進(jìn)行數(shù)據(jù)校驗的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
koa-router源碼學(xué)習(xí)小結(jié)
這篇文章主要介紹了koa-router源碼學(xué)習(xí)小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09

