node.js экспресс-проверка сеанса Azure Store после сбоя приложения
Я настроил экспресс-сеанс в моем приложении узла для использования таблицы хранилища Azure (connect-azuretables), и он работает частично. т.е. когда пользователь входит в систему, я могу захватить идентификатор пользователя и установить его для сеанса, пока пользователь не закрывает браузер, сеанс действителен. Я также могу хранить его в лазурном магазине.
Во время входа в систему я также сохраняю этот сеанс в глобальном массиве в приложении узла. В промежуточном программном обеспечении я проверяю, есть ли у входящего запроса допустимый сеанс для значений в этом массиве. Это работает до тех пор, пока приложение не разбилось или не перезапустилось. После перезапуска глобальный массив становится пустым, и сеанс больше не может быть аутентифицирован.
У меня проблема в том, что я не знаю, как проверить действующие сеансы в лазурном хранилище. Я пробовал такие методы, как '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);
});
Я просмотрел несколько руководств по экспресс-сеансу и собрал то, что почти не работает. Первое, что у меня возникло с трудом, - это как проверить в хранилище Azure, действителен ли сеанс?
Во-вторых, следует ли мне кэшировать сведения о сеансе из хранилища Azure в память и использовать память в первую очередь для повышения производительности или проверять с помощью хранилища Azure при каждом контакте правильный способ сделать это.