2016-07-07 4 views
0

Я думал, что сеанс должен содержать информацию о компьютере пользователя пользователя до тех пор, пока он не истечет, или я не уничтожу его. что я хочу сделать, если пользователь анонимный, создайте для него идентификатор, поместите его в сеанс и где каждый он отправляется на сайт или клики, я мог бы хранить материал в записи БД, принадлежащей анонимному пользователю по идентификатору.Почему я получаю новый сеанс при обновлении страницы (я создал сеанс после сохранения())

Я использую промежуточное программное обеспечение, чтобы проверить, зарегистрирован ли пользователь с паспортом на каждом маршруте, и если он не хочет, я хочу создать req.session.anon. Я назначил req.session.anon объекту ObjectId, который был создан при сохранении анона (см. Код). Во второй раз (обновление страницы) пользователь должен иметь идентификатор session.anon, поэтому эта проверка должна завершиться неудачно }else if(!req.session.anon){, но это не так, и я создаю другую запись с новым идентификатором.

app.use(function(req, res, next){ 
    // console.log("req.user :::: ", req.user.local.username) 
    if(req.user){ 
     app.locals.userid = req.user._id; 
     app.locals.username = req.user.local.username; 
     console.log("req.user is there") 
    }else if(!req.session.anon){ 
     var anon = new Anon() 
     anon.save(function(err, data){ 
      console.log(data) 
      req.session.anon = data._id 

      console.log("req.session.anon " , req.session.anon);// prints out the ID 
     })    
    } 
    next(); 
}); 

сессия создана

app.use(session({secret : "thisisastring", 
         saveUninitialized : true, 
         resave : true 
})); 

EDIT Im думают, что теперь у него есть что-то делать с установкой req.session.anon = data._id в обратном вызове. но req.session устанавливается с консоли

+0

Каких 'session' библиотеки вы используете? – jfriend00

ответ

0

У вас проблема с упорядочиванием. Я не уверен, что это вызывает проблему с сеансом, но это определенно не так, как вы это делаете.

anon.save() представляется асинхронным. Это означает, что он заканчивает некоторое время LATER и вызывает его обратный вызов. Но перед этим вы звоните next(). Таким образом, это означает, что req.session.anon не будет на месте, когда вызывается next(), что означает, что последующие обработчики для этого запроса не будут видеть значение req.session.anon. Вероятно, автозагрузка произойдет до того, как вы добавите req.session.anon и, таким образом, он не будет сохранен.

Вы можете решить эту проблему следующим образом:

app.use(function(req, res, next){ 
    // console.log("req.user :::: ", req.user.local.username) 
    if(req.user){ 
     app.locals.userid = req.user._id; 
     app.locals.username = req.user.local.username; 
     console.log("req.user is there") 
     next(); 
    }else if(!req.session.anon){ 
     var anon = new Anon() 
     anon.save(function(err, data){ 
      console.log(data) 
      req.session.anon = data._id 

      console.log("req.session.anon " , req.session.anon);// prints out the ID 
      next(); 
     })    
    } else { 
     next(); 
    } 
}); 

Это ждет, чтобы позвонить next() до тех пор, после того, как вы обновили сессии.


Потому что ваше использование resave функции является устаревшим, он также может иметь смысл для вас, чтобы вручную сохранить сеанс после его изменения:

app.use(function(req, res, next){ 
    // console.log("req.user :::: ", req.user.local.username) 
    if(req.user){ 
     app.locals.userid = req.user._id; 
     app.locals.username = req.user.local.username; 
     console.log("req.user is there") 
     next(); 
    }else if(!req.session.anon){ 
     var anon = new Anon() 
     anon.save(function(err, data){ 
      console.log(data) 
      req.session.anon = data._id; 
      req.session.save(function() { 
       console.log("req.session.anon " , req.session.anon);// prints out the ID 
       next(); 
      }); 
     }); 
    } else { 
     next(); 
    } 
}); 
1

Сессия обычно связана с браузером через файл cookie.

Используйте скрипач, чтобы посмотреть, записано ли cookie сеанса в поток ответов и что куки-файл отправляется обратно со следующими запросами.

Возможно, вам нужно переместить следующий() в начальное предложение if и в нижнюю часть метода else..save callback, чтобы убедиться, что сеанс прикреплен к ответу до его закрытия.

+0

Я никогда не пользовался скрипачом. Взгляните позже. Я не знаю, поможет ли мой путь. но я хочу сказать, что если я поставлю 'console.log (« Outside. req.session.anon », req.session.anon);' вне 'if else' я получаю' Outside. req.session.anon undefined' в консоли, поэтому похоже, что он не определен в области. –

+0

вызов возврата сохраняется как асинхронный, а next() может быть вызван до установки anon в сеансе – Steve

+0

Я думаю, что вижу некоторые улучшения. Он только сохраняет пользователя anon один раз. Я помещаю 'next()' в 'if' и в' if else'.Я также должен был сделать 'else' и поставить' next() 'там, поэтому значок поворота на вкладке страницы перестанет вращаться. Это то, что вы рекомендовали? Звучит неплохо? Благодарю. –

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