1

Express アプリでメッセージ アラート ミドルウェア connect-flash を使用しています。このミドルウェアは github https://github.com/jaredhanson/connect-flashにあります。
connect-flash のソース コードを見ると、this.session オブジェクトがどこから来たのか本当にわかりません。connect-flash のソース コードを考えてみましょう。

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();
  }
}

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) {
    // util.format is available in Node.js 0.6+
    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;
  }
}

Express で実装するには、app.configure ブロック内に含める必要があります。コードを検討する

app.configure(function () {
        //Other middleware
        app.use(function (req, res, next) {
            console.log(this.session);
            next();
        });
        app.use(flash());

カスタム ミドルウェアを見てください。this.session オブジェクトを表示すると、「未定義」になります。connect-flash で this.session が機能するのはなぜですか。セッション オブジェクトは取得できますが、ミドルウェアでは取得できません。ミドルウェアを作成するためのコールバック パターンはまったく同じです

(function (req, res, next) {
        //Code
         next();
}
4

1 に答える 1

1

セッション オブジェクトは、セッション ミドルウェアによって追加されます。未定義の場合req.sessionは、セッション ミドルウェアが定義されていないか、期待されるミドルウェアの後に定義されています。

定義済み

  • セッションミドルウェア
  • カスタムミドルウェア: req.session が定義されています

未定義

  • カスタム ミドルウェア: オブジェクトが後で追加されるため、 req.session は未定義です。
  • セッションミドルウェア

私の推測では、フラッシュ ミドルウェアは の後に定義されてexpress.sessionいますが、カスタム ミドルウェアは の前に定義されていますexpress.session

Express は、リクエストに対応してレスポンスを返す単なる関数 (ミドルウェア) の配列であるため、これらの関数を定義する順序が重要であることを意味します。

于 2013-08-09T18:12:01.693 に答える