Я занимаюсь разработкой приложения с использованием 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')
.