Express框架之connect-flash詳解
第一步:我們首先來(lái)看看這個(gè)插件的使用
var flash = require('connect-flash');
app.use(flash());//Express使用這個(gè)插件
第二步:我們看看其內(nèi)部是如何實(shí)現(xiàn)的
var format = require('util').format;
var isArray = require('util').isArray;
依賴的模塊為node.js的核心模塊util
module.exports = function flash(options) {
options = options || {};
//如果用戶沒(méi)有指定unsafe參數(shù),那么safe就是true;否則如果用戶指定了unsafe為false那么safe就是true
//也就是說(shuō)這個(gè)插件只能指定一個(gè)配置項(xiàng)就是unsafe,默認(rèn)不指定為就是安全的!
var safe = (options.unsafe === undefined) ? true : !options.unsafe;
return function(req, res, next) {
//如果req.flash存在,同時(shí)是safe的那么直接調(diào)用下面一個(gè)插件,這個(gè)插件就不執(zhí)行了
if (req.flash && safe) { return next(); }
//如果上面的條件不滿足那么為req指定flash屬性,其值為下面的_flash函數(shù)
req.flash = _flash;
next();
}
}
很顯然,我們看到可以傳入options參數(shù),如果沒(méi)有指定unsafe那么unsafe就是true,此時(shí)safe就是false。如果用戶明確指定了unsafe為false那么safe為true,如果明確指定了unsafe為false那么safe就是true。如果safe為true那么直接調(diào)用下面一個(gè)中間件。
我們現(xiàn)在看看req對(duì)象的flash方法是怎么樣的:
function _flash(type, msg) {
//如果當(dāng)前req對(duì)象沒(méi)有session域,那么拋出錯(cuò)誤
if (this.session === undefined) throw Error('req.flash() requires sessions');
//為req.session.flash指定一個(gè)域,默認(rèn)為空對(duì)象
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í)傳入的參數(shù)有兩個(gè)以上
if (arguments.length > 2 && format) {
var args = Array.prototype.slice.call(arguments, 1);
//獲取第二個(gè)參數(shù)以后的數(shù)組
msg = format.apply(undefined, args);
//msg保存的是第二個(gè)參數(shù)以后的值,并對(duì)這個(gè)值進(jìn)行了format處理
} else if (isArray(msg)) {
msg.forEach(function(val){
(msgs[type] = msgs[type] || []).push(val);
});
return msgs[type].length;
//如果傳入的第二個(gè)參數(shù)是一個(gè)數(shù)組,那么全部把數(shù)據(jù)綁定到req.session.flash域里面,其中數(shù)據(jù)類(lèi)型為{'info':['school','home']}
//然后返回的是特定的長(zhǎng)度
}
//如果參數(shù)不多于2,同時(shí)msg也不是數(shù)組,那么把msg添加到req.session.flash中然后返回
return (msgs[type] = msgs[type] || []).push(msg);
} else if (type) {
//如果沒(méi)有指定msg,僅僅指定了type,這時(shí)候我們獲取到req.session.flash中特定類(lèi)型的數(shù)據(jù),同時(shí)把數(shù)據(jù)從req.session.flash中刪除
var arr = msgs[type];
delete msgs[type];
return arr || [];
} else {
//如果調(diào)用方式如flash()也就是不傳入任何參數(shù),這時(shí)候直接清空了req.session.flash中的數(shù)據(jù)
this.session.flash = {};
return msgs;
}
}
(1)如果傳入的參數(shù)多于兩個(gè),那么首先獲取第二個(gè)以及以后的參數(shù),然后對(duì)第二個(gè)以后的參數(shù)進(jìn)行format操作,最后把數(shù)據(jù)封裝到req.session.flash中,同時(shí)返回。
req.flash('info', 'email has been sent to %s.', userName);
(2)如果傳入的第二個(gè)參數(shù)是一個(gè)數(shù)組,那么把這個(gè)數(shù)組每一個(gè)元素封裝到req.session.flash中,然后返回特定type的數(shù)據(jù)的長(zhǎng)度
(3)否則如果僅僅傳入了type表示獲取指定類(lèi)型的數(shù)據(jù)然后返回,并把數(shù)據(jù)從req.session.flash中刪除(這樣只要我們調(diào)用這個(gè)方法獲取了數(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');
// => []這時(shí)候info已經(jīng)清空了
(4)如果用戶沒(méi)有傳入任何參數(shù)那么清空req.session.flash域,但是返回的是原來(lái)的局部變量保存到的req.session.flash對(duì)象
else {
//如果調(diào)用方式如flash()也就是不傳入任何參數(shù),這時(shí)候直接清空了req.session.flash中的數(shù)據(jù)
this.session.flash = {};
return msgs;
}
這個(gè)插件一般和redirect一起使用,保證在渲染下一個(gè)頁(yè)面的時(shí)候數(shù)據(jù)可用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 從零開(kāi)始學(xué)習(xí)Node.js系列教程之基于connect和express框架的多頁(yè)面實(shí)現(xiàn)數(shù)學(xué)運(yùn)算示例
- 解決Node.js使用MySQL出現(xiàn)connect ECONNREFUSED 127.0.0.1:3306的問(wèn)題
- Node.js connect ECONNREFUSED錯(cuò)誤解決辦法
- NodeJS學(xué)習(xí)筆記之Connect中間件應(yīng)用實(shí)例
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(二)
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(一)
- 分析Node.js connect ECONNREFUSED錯(cuò)誤
相關(guān)文章
node.js WEB開(kāi)發(fā)中圖片驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了node.js WEB開(kāi)發(fā)中圖片驗(yàn)證碼的實(shí)現(xiàn)方法,使用ccap模塊實(shí)現(xiàn),需要的朋友可以參考下2014-06-06
node+koa實(shí)現(xiàn)數(shù)據(jù)mock接口的方法
本篇文章主要介紹了node+koa實(shí)現(xiàn)數(shù)據(jù)mock接口的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
node.js開(kāi)機(jī)自啟動(dòng)腳本文件
這篇文章主要介紹了node.js開(kāi)機(jī)自啟動(dòng)腳本文件的方法和代碼,這里分享給大家,有需要的小伙伴參考下吧2014-12-12
node.js實(shí)現(xiàn)博客小爬蟲(chóng)的實(shí)例代碼
這篇文章通過(guò)實(shí)例代碼來(lái)給大家介紹如何利用node.js實(shí)現(xiàn)博客小爬蟲(chóng),有需要的朋友們可以直接運(yùn)用文中給出的實(shí)例代碼來(lái)進(jìn)行實(shí)踐學(xué)習(xí),感興趣的朋友們下面來(lái)一起看看吧。2016-10-10
Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器
這篇文章主要介紹了Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器,本文講解了setTimeout、setInterval、setImmediate及process.nextTick等內(nèi)容,需要的朋友可以參考下2014-10-10
基于Express+multer實(shí)現(xiàn)文件上傳功能
Multer是Node.js中的一個(gè)第三方包,或者說(shuō)是第三方中間件,主要用于是實(shí)現(xiàn)文件上傳的功能,本文小編講給大家詳細(xì)介紹一下基于Express+multer來(lái)實(shí)現(xiàn)文件上傳功能,文章通過(guò)代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11

