Узел Express Сессия Redis не сохраняется после res.redirect () - PullRequest
0 голосов
/ 19 февраля 2020

Я занимаюсь разработкой приложения с использованием Spotify Web API. Каждый раз, когда пользователь входит в систему, правильные пользовательские данные обрабатываются и сохраняются в сеансе Redis. Однако при ПЕРВОЙ попытке входа в систему, когда я перенаправляю на другой маршрут, новый, приложение пытается получить доступ к пустому новому сеансу. При последующих попытках приложение обращается к правильному сеансу, и приложение ведет себя нормально. Цикл повторяется каждый раз, когда я выхожу из системы.

Соответствующий код:

Конфигурация Redis Store в приложении. js

let RedisStore = require('connect-redis')(session);

let client = redis.createClient({
  host: 'localhost',
  port: 6379,
  //password: REDIS_KEY,
  db: 1
})
client.unref();
client.on('error', console.log)

app.use(session({
  store: new RedisStore({ client }),
  secret: REDIS_KEY,
  resave: false,
  saveUninitialized: false,
  rolling: true,
  unset: 'destroy',
  cookie: { maxAge: 3600000, sameSite: true, secure: false, httpOnly: false } // 1 hr
}))

Spotify API Callback route (сеанс сохраняются здесь полностью)

let set_json = new Promise((resolve, reject) =>{
    FUNCTIONS.set_json(req, new CLASSES.user_info(user_id, display_name, profile_picture, playlists));
    if (req.session.json) resolve(); else reject("error setting JSON");
})

set_json.then(
    function(set_success) {
        console.log("ID: " + req.sessionID);
        req.session.save(function(){
            res.redirect('/home');
        });
    },
    function(set_error){
        console.log(set_error);
    }
);

set_ json функция

exports.set_json = function(req, data) {
    let set_promise = new Promise((resolve, reject) =>{
        req.session.json = JSON.parse(JSON.stringify(data));
        if (req.session.json) resolve("success!"); else reject("error!");
    });

    set_promise.then(
        function(success){
            console.log(success);
        },
        function(failure) {
            console.log(failure);
            console.log("something went wrong!");
        }
    );
}

Домашний маршрутизатор, где только что заданное мной требование потеряно при первой попытке входа в систему , Последующие попытки входа в систему успешно загружают правильные данные.

exports.get_home = function(req, res, next) {
    console.log("ID: " + req.sessionID);

    res.render('home', { title: 'Spotify Playlist Optimizer', user: req.session.json});
}

Некоторые примеры вывода:

Первая попытка входа в систему:

//Callback session id, holds correct data
ID: bvLDb6OwlBAPASAQqHBni2uIFfe-ASU3

//router session id, a blank, new session
ID: m2gEaduOyjde07b7aWvRVya4WkPze5M8

Последующие попытки входа в систему до выхода из системы:

// Callback session id
ID: bvLDb6OwlBAPASAQqHBni2uIFfe-ASU3

// Router session id
ID: bvLDb6OwlBAPASAQqHBni2uIFfe-ASU3

// (matching and holding all needed data)

РЕДАКТИРОВАТЬ: Нашел странное, надеюсь, не постоянное решение: я отредактировал файл Express lib / response. js, изменив реализацию res.redirect ():

html: function(){
      var u = escapeHtml(address);
      body = "<script>window.location.href = '." + u + "';</script>";
    },

А затем изменили res.redirect('/home') на res.redirect(200, '/home').

...