2015-05-01 4 views
2

Я пытаюсь реализовать простой логин с узлом и выразить, сохраняя информацию пользователя вошедшего в систему в экспресс-сеансе. Вот что у меня до сих порЭкспресс-сессия не сохраняется ... если я не обновляю свой браузер?

Применение:

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: Так, упрощенный порядок событий:

  1. клиент: http.post ("/ Логин", {идентификатор: .., PW: ...});
  2. сервер пользователя инжектора маршрут: неудачно, то сессия (что не в порядке, потому что мы собираемся создать), так называет следующим()
  3. сервер Войти маршрут: полномочия в порядке, так он должен создать сеанс. то он возвращает ответ клиенту.
  4. клиент: сервер говорит, что мы хорошо идти, так: http.get («/ protectedstuff»)
  5. сервер пользователем инжектор маршрут: выходит из строя, не 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
+0

Ваш «впрыснуть вошедшего в систему пользователя» промежуточного слоя привязываясь до «POST/логин» маршрут? –

+0

@AndrewLavers Yup. Я добавлю информацию о том, как настроен мой маршрутизатор. – Alex

+1

Что такое переменная 'user'? Это похоже на полу-глобальный, который выглядит как проблема в любое время, когда несколько запросов находятся в полете одновременно. – jfriend00

ответ

1

После много возни я, наконец, удалось зафиксировать проблема. Или, может быть, это просто обходной путь. Проблема заключалась в том, что я не указывал хранилище по умолчанию для данных сеанса на сервере. Поэтому по умолчанию Express использует память, которая, по-видимому, не так велика.

Я использую connect-mongo как хранилище сеансов сейчас, и кажется, что все работает, хотя я все еще подозреваю, что где-то есть ошибка.

Для полноты, вот как я устанавливаю вверх выразить прямо сейчас:

var express = require("express"); 
var session = require("express-session"); 
var mongoose = require("mongoose"); 
var MongoStore = require("connect-mongo")(session); 

var app = express(); 
// same cookieparser, bodyparser, etc setup as before 
app.use(session({ 
    secret:SESSION_SECRET, 
    resave: true, 
    saveUninitialized: false, 
    rolling: true, 
    store: new MongoStore({mongooseConnection:mongoose.connection}), 
    cookie: { 
     httpOnly: false, 
     secure: false, 
     maxAge:COOKIE_MAX_AGE 
    } 
})); 
0

Отредактировано:

К сожалению, я ошибся, я думал, первый удар в /login маршрут был тот, который не запуская «Нет сессии здесь «. log, что имело бы смысл с учетом заказа. Я сделал правку, чтобы сделать вещи немного яснее

Тем не менее, я хотел бы предложить, глядя в passport.js вместо прокатки свой собственный код входа: http://passportjs.org/guide/username-password/

+0

Я не думаю, что это проблема с промежуточным программным обеспечением для инъекций. В первый раз, когда я пытаюсь войти в систему, я не ожидаю увидеть информацию о сеансе. Однако, любые другие запросы после этого, сделанные через маршрутизатор, я ожидаю увидеть что-то там в сеансе. Но я этого не делаю. Я добавлю дополнительную информацию в порядок операций, чтобы помочь объяснить, что происходит немного лучше. – Alex

+0

О, я вижу. Исходя из того, что вам нужно дважды войти в систему, чтобы все могло работать, кажется, что ваш логин в зависимости от состояния сеанса уже существует, чтобы сохранить 'session.userId'. Я не уверен. –

Смежные вопросы