2017-02-20 1 views
0

セッション用にMongoDBとSequelize(PostgreSQL)の間で切り替え可能なnode.js Webアプリケーションがあります。両方のために、私はフラッシュ・メッセージのためにconnect-flash(また、エクスプレス・フラッシュを試したミドルウェア)をレイヤーします。要するに、MongoDBは動作しますが、Sequelizeは動作しません。フラッシュメッセージがconnect-session-sequelizeで動作しない

アプリには、ユーザーが編集できる「パッケージ」という概念があります。ユーザーがパッケージを正常に編集した後、

"${timestamp} Package ${pkgID} successfully updated." 

のフラッシュメッセージを設定してリダイレクトします。 Sequelize(connect-session-sequelize)を使用すると、フラッシュメッセージはデータベースに表示されても表示されず、ページを更新するとにはが表示されます。ここで

がSequelizeセッションのセットアップです:私のDEBUG環境変数に余分に取得する:

var cookieParser = require('cookie-parser'); 
var expSession = require('express-session'); 
var flash = require('express-flash'); 

app.use(cookieParser(process.env.COOKIE_SECRET)); 

if (sessionDBVendor === 'postgres') { 
    let models = require('./models/postgres'); 
    var SequelizeSessionStore = require('connect-session-sequelize')(expSession.Store); 
    var sequelizeSessionStore = new SequelizeSessionStore({ 
     db: models.sequelize, 
     table: 'Session' 
    }); 
    sequelizeSessionStore.on('set', function (data) { 
     debug(`SequelizeSessionStore: Session ${data} UPDATED.`); 
    }); 
    app.use(
     expSession({ 
      secret: process.env.COOKIE_SECRET, 
      store: sequelizeSessionStore, 
      resave: false, // we support the touch method so per the express-session docs this should be set to false 
      proxy: false, // if you do SSL outside of node. 
      saveUninitialized: false, 
     }) 
    ); 
} 
app.use(flash()); 

は、connect-セッションsequelizeのソースコードを見ると、私は、「セッション・sequelizeを接続する」を追加できることが分かっ情報をコンソールに表示します。ここにコンソールログの興味深い部分があります。いくつかの書式と、いくつかの空白行と、数字が追加されています。 (1)、UPDATEが行われている時に、更新のための "データ" で、 "フラッシュ" は、オブジェクトが含まれていることを

 connect:session-sequelize INSERT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +5s 
    Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt" 
      FROM "webjmp"."sessions" AS "Session" 
      WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'; 
     connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +10ms 
    Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt" 
      FROM "webjmp"."sessions" AS "Session" 
      WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'; 

(1) 
    Executing (default): UPDATE "webjmp"."sessions" SET "expires"='2017-02-21 15:53:54.738 +00:00', 
      "data"='{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}, 
       "flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}}', 
      "updatedAt"='2017-02-20 15:53:54.756 +00:00' WHERE "sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI' 

(2) 
     connect:session-sequelize FOUND DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI with data 
     {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"flash":{}} +17ms 

    Executing (default): SELECT "Package"."_id", "Package"."title", "Package"."description", 
      {content removed for brevity} 
      FROM "webjmp"."packages" AS "Package" 
      {content removed for brevity} 
      ORDER BY "Package"."timestamp" DESC; 
    ::1 - - [20/Feb/2017:15:53:54 +0000] "POST /packages/58a718a0280081343eeab6d9 HTTP/1.1" 302 62 
     packages ID of package in returned list: 58a718a0280081343eeab6d9 +166ms 
     packages ID of package in returned list: 58a716c35326d0b0380c0b37 +0ms 
     packages ID of package in returned list: 58a474c55c9f18cc31cb0e2a +0ms 
     packages ID of package in returned list: 58a45dfa51f335c015d8591f +0ms 
     packages ID of package in returned list: 589cc7f30a333d1864b07bb2 +0ms 

(3) 
     packages listPackages: flashSuccess: [] +0ms 

     connect:session-sequelize TOUCH "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +92ms 
    Executing (default): UPDATE "webjmp"."sessions" SET "expires"='2017-02-21 15:53:55.023 +00:00', 
      "updatedAt"='2017-02-20 15:53:55.024 +00:00' 
      WHERE "sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI' 
    ::1 - - [20/Feb/2017:15:53:55 +0000] "GET /packages HTTP/1.1" 200 6909 
     connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +14ms 
    Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt" 
      FROM "webjmp"."sessions" AS "Session" 
      WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'; 
     connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +6ms 
    Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt" 
      FROM "webjmp"."sessions" AS "Session" WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'; 

(4) 
     connect:session-sequelize FOUND DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI with data 
      {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}, 
      "flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}} +3ms 

注:

"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]} 

私のフラッシュメッセージです。ただし、ノートはで(2)、接続セッション-sequelizeのデバッグは、それが見つけたセッションを示すFOUNDメッセージを吐き出し、それが示しセッションオブジェクトに、フラッシュがです:

"flash":{} 

ちょうどその後、(3)、私のコードは "flashSuccess"フラッシュメッセージを取得しようとしますが、空の配列が表示されます。しかし、その後、(4)で、接続セッション-sequelizeは別FOUNDデバッグメッセージを吐き出し、この1は、その中にフラッシュメッセージがあります。

"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]} 

を、私はデータベースをチェックすると、そこにそれがあります。

フラッシュメッセージを設定しているUPDATEは非同期的に起こっていて、(2)でセッションが取得されるまでに完了していませんが、後で表示されます。しかし、フラッシュメッセージを設定した後にsetTimeout()をスローしてみましたが、無駄です。

ここで何が起こっているのですか?

UPDATE:私は、PostgreSQLにセッションを保存するためにconnect-pg-simpleミドルウェアを使用する3番目のセッション格納オプションを追加しました。このオプションでは、フラッシュメッセージはうまく動作します。 connect-session-sequelizeは奇妙な人であるようです。

答えて

0

issues board for connect-session-sequelizeで明示的セッションにこれらのフラッシュメッセージシナリオで競合状態があり、フラッシュメッセージの設定後にreq.session.save(cb)を呼び出す必要があることが指摘されましたが、条件を回避するために、コールバックの応答を返します。例:

req.flash('flashError', err.message); 
req.session.save(function() { 
    res.redirect('/packages'); 
}); 

このように問題が解決しました。

関連する問題