Я настроил express -сессию в моем приложении узла для использования таблицы хранения Azure (connect-azuretables), и она работает частично. то есть, когда пользователь входит в систему, я могу получить идентификатор пользователя и установить его для сеанса, пока пользователь не закрывает браузер, сеанс действителен. Я также могу сохранить его в магазине azure.
Во время входа в систему я также сохраняю этот сеанс в глобальном массиве в приложении узла. В промежуточном программном обеспечении я проверяю, есть ли у входящего запроса допустимый сеанс для значений в этом массиве. Это работает до тех пор, пока приложение не разбилось или не перезапустилось. После перезапуска глобальный массив становится пустым, и сеанс больше не может быть аутентифицирован.
Моя проблема в том, что я не знаю, как проверить хранилище azure на наличие действительных сеансов. Я пробовал такие методы, как req.session.get, и получаю сообщение об ошибке «TypeError: req.session.get не является функцией»
Вот соответствующий код:
const redirectToLogin = (req, res, next) => {
if(!req.session.userId){
res.redirect(302, '/getstarted.html');
} else {
next();
}
}
const redirectToDashboard = (req, res, next) => {
if (req.session.userId && req.session.key) { // user already logged in, go to dashboard
// improve upon this to check for validity better
res.redirect(302, '/dashboard/');
} else {
next();
}
}
app.use((req, res, next) => {
const { userId, key } = req.session;
if (userId && key) { // here if we find userId, then we inject it into res.locals so it can be accessed by every route.
// improve upon this to also check for key and validity
res.locals.user = arrLoggedInUsers.find (
user => user.UserId === userId
)
// if a match was not found in arrLoggedInUsers, then also check azure store before rejecting
// coz request had session info.
if(typeof res.locals.user === 'undefined'){
// I can't find a working example of how to do this part
}
}
next()
});
app.post('/signin', function(req,res){
// verify login, then assign appropo values to session
req.session.userId = userId;
req.session.key = sessionKey;
req.session.save(function(err) {
if(err)
logger.errorLog(func_id + "Error - " + err);
// session saved
return res.redirect(302, "/dashboard/");
})
})
app.get('/dashboard/', redirectToLogin, function(req, res) {
handlePageForLoggedInUser("home.html", req, res);
});
Я прошел через несколько руководств по сеансу express и собрал то, что почти не работает. Первое, что у меня возникли проблемы с выяснением: как мне проверить хранилище azure на предмет допустимости сеанса?
Во-вторых, следует ли мне кэшировать данные сеанса из хранилища azure в память и сначала используйте память для повышения производительности или проверяет с помощью azure store при каждом контакте правильный способ go об этом.