第一步:咱們首先來看看這個插件的使用javascript
- var flash = require('connect-flash');
- app.use(flash());
第二步:咱們看看其內部是如何實現的java
- var format = require('util').format;
- var isArray = require('util').isArray;
依賴的模塊爲node.js的核心模塊utilnode
- module.exports = function flash(options) {
- options = options || {};
-
-
- var safe = (options.unsafe === undefined) ? true : !options.unsafe;
- return function(req, res, next) {
-
- if (req.flash && safe) { return next(); }
-
- 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) {
-
- if (this.session === undefined) throw Error('req.flash() requires sessions');
-
- var msgs = this.session.flash = this.session.flash || {};
- if (type && msg) {
-
-
- if (arguments.length > 2 && format) {
- var args = Array.prototype.slice.call(arguments, 1);
-
- msg = format.apply(undefined, args);
-
- } else if (isArray(msg)) {
- msg.forEach(function(val){
- (msgs[type] = msgs[type] || []).push(val);
- });
- return msgs[type].length;
-
-
- }
-
- return (msgs[type] = msgs[type] || []).push(msg);
- } else if (type) {
-
- var arr = msgs[type];
- delete msgs[type];
- return arr || [];
- } else {
-
- this.session.flash = {};
- return msgs;
- }
- }
(1)若是傳入的參數多於兩個,那麼首先獲取第二個以及之後的參數,而後對第二個之後的參數進行format操做,最後把數據封裝到req.session.flash中,同時返回。session
- req.flash('info', 'email has been sent to %s.', userName);
(2)若是傳入的第二個參數是一個數組,那麼把這個數組每個元素封裝到req.session.flash中,而後返回特定type的數據的長度app
(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');
- req.flash('info');
(4)若是用戶沒有傳入任何參數那麼清空req.session.flash域,可是返回的是原來的局部變量保存到的req.session.flash對象ui
- else {
-
- this.session.flash = {};
- return msgs;
- }
這個插件通常和redirect一塊兒使用,保證在渲染下一個頁面的時候數據可用。this
以爲有用的小夥伴門幫忙掃一下二維碼,謝謝!