Я пытаюсь реализовать простой логин с узлом и выразить, сохраняя информацию пользователя вошедшего в систему в экспресс-сеансе. Вот что у меня до сих порЭкспресс-сессия не сохраняется ... если я не обновляю свой браузер?
Применение:
var express = require("express");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var bodyParser = require("body-parser");
var app = express();
app.use(cookieParser(SESSION_SECRET));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(session({secret:SESSION_SECRET, resave:true, saveUninitialized:true, cookie:{httpOnly: false, secure:false, maxAge:COOKIE_MAX_AGE}}));
// a couple app.use statements to serve static files from a public folde
Мой Логин маршрут делает это:
router.post("/login", function(request, response)
{
// authentication stuff. if the user is authenticated:
request.session.userId = user._id;
request.session.save();
response.json({success:true, user: user._id});
});
В другом месте, у меня есть это автоматически вводить данные пользователя для других моих маршрутов:
// inject currently-logged-in user info into all requests
router.use(function(request, response, next)
{
// No session and no user ID means no user. So just go on.
if(null == request.session || null == request.session.userId)
{
console.log("No session here.");
return next();
}
// Try to find the user. Look up the user id in the db, then do this:
request.user = dbUser;
next();
});
// External Routes
require("./routes/Login")(router); // this is where router.post("/login") is
require("./routes/User")(router); // another route that looks up user info
Что странно в том, что после того, как я вхожу в систему в первый раз, при последующих запросах я вижу, что сеанса не существует («Нет сеанса здесь» в TTY), но когда я обновляю свой браузер и регистрирую второй времени, он есть.
EDIT: Так, упрощенный порядок событий:
- клиент: http.post ("/ Логин", {идентификатор: .., PW: ...});
- сервер пользователя инжектора маршрут: неудачно, то сессия (что не в порядке, потому что мы собираемся создать), так называет следующим()
- сервер Войти маршрут: полномочия в порядке, так он должен создать сеанс. то он возвращает ответ клиенту.
- клиент: сервер говорит, что мы хорошо идти, так: http.get («/ protectedstuff»)
- сервер пользователем инжектор маршрут: выходит из строя, не Sesion (что он должен иметь был создан к этому моменту)
EDIT 2: Дополнительная информация. Это становится более странным? Это происходит только после перезагрузки сервера и только для первой попытки входа в систему. Как только первый пользователь сможет войти в систему и получить сеанс, любая другая попытка входа в систему будет успешной. Даже если первый пользователь выходит из системы.
На данный момент я начинаю задаваться вопросом, есть ли ошибка в экспресс-сессии. Этот первый вызов для хранения переменной сеанса не работает по какой-либо причине.
Я не уверен, в чем проблема. Мой браузер делает довольно простые HTTP-запросы с угловым, и он правильно хранит идентификатор пользователя. Я совершенно ясно вижу, что объект данных json response имеет значение {success: true, user: (user id)}, поэтому все выглядит нормально с этой целью. Я в тупике. Почему не экспресс-сохранение моей информации о сеансе в маршруте входа?
версии пакета:
- тела анализатор: 1.12.3
- печенья анализатор: 1.3.4
- экспресс: 4.12.3
- экспресс-сессия: 1.11.1
- угловой: 1.3.15
Ваш «впрыснуть вошедшего в систему пользователя» промежуточного слоя привязываясь до «POST/логин» маршрут? –
@AndrewLavers Yup. Я добавлю информацию о том, как настроен мой маршрутизатор. – Alex
Что такое переменная 'user'? Это похоже на полу-глобальный, который выглядит как проблема в любое время, когда несколько запросов находятся в полете одновременно. – jfriend00