2017-02-20 53 views
0

У меня есть веб-приложение node.js, которое можно переключать между MongoDB и Sequelize (PostgreSQL) для сеансов. Для обоих я также использую связующее ПО для флеш-сообщений. Короче говоря, MongoDB работает, Sequelize этого не делает.Flash-сообщения, не работающие с connect-session-sequelize

Приложение имеет понятие «пакеты», которое пользователь может редактировать. После успешного завершения редактирования пакета я установил флэш-сообщение

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

и перенаправить. С Sequelize (connect-session-sequelize) флэш-сообщение не отображается, хотя я могу видеть его в базе данных, и если обновить страницу, то появится .

Вот настройки для сеансов Sequelize:

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 исходного кода, я обнаружил, что я мог бы добавить "подключиться: Session-sequelize" к моей переменной окружения DEBUG, чтобы получить дополнительную информацию в консоли. Вот интересная часть журнала консоли, с некоторым форматированием, добавлены пустые строки и цифры.

 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 

Обратите внимание, что в (1), обновление будет сделано, и в «данных» для обновления, «вспышка» содержит объект:

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

Это моя вспышка сообщение. Тем не менее, обратите внимание на (2), соедините с сессией sequelize отлаживать выплевывает FOUND сообщение с указанием сессии, что он нашел, и в объекте сеанса он показывает, вспышка пустой:

"flash":{} 

Только после этого , в (3) мой код пытается получить флэш-сообщение «flashSuccess», но он содержит пустой массив. Но тогда, в (4), соедините с сессией sequelize выплевывает другой FOUND отладки сообщение, и это одна имеет флэш-сообщение в нем:

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

и если я проверить базу данных, там.

Это почти как если бы UPDATE, устанавливающий флеш-сообщение, происходит асинхронно и не завершено к моменту получения сеанса по адресу (2), но затем оно появляется. Но я попытался сбросить setTimeout() после установки флеш-сообщения, но безрезультатно.

Любые идеи, что здесь происходит?

ОБНОВЛЕНИЕ: я добавил параметр хранения третьего сеанса, который использует промежуточное программное обеспечение connect-pg-simple для хранения сеансов в PostgreSQL. С помощью этой опции флеш-сообщения работают нормально. 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'); 
}); 

Выполнение этой задачи.