Wpis z mikrobloga

#nodejs #programowanie

Cześć,
Mam problem z przekazaniem obiektu do widoku. Do aplikacji można zalogować się „tradycyjnie” lub poprzez facebooka. Na następnej stronie ma ukazać się informacja ‘witaj xyz’ jesteś zalogowany. Pojawia się problem logując się za pomocą facebooka, ponieważ pomimo zapisania do sesji obiektu przy próbie jego przekazania do widoku pojawia się informacja req.user undefined. Taką samą informację miałem gdy logowałem się „tradycyjnie”. Okazało się jednak, że pomogła zmiana kolejności inicjalizacji modułów Express session oraz passport. Brakuje już mi pomysłów. Zamieszczam kod może ktoś znów zauważy złą kolejność czy jakiś błąd. Zastanawiam się jeszcze czy nie można tego inaczej rozwiązać np. zapisać so sesji req.session.user = user w momencie serializacji jednakże nie mamy tam req.
Kod:
serwer
route

dependencies:
"bcryptjs": "^2.3.0",
"body-parser": "~1.15.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.13.4",
"express-session": "latest",
"express-validator": "latest",
"hbs": "~4.0.0",
"mongodb": "latest",
"mongoose": "latest",
"morgan": "~1.7.0",
"passport": "latest",
"passport-facebook": "latest",
"passport-local": "^1.0.0",
"serve-favicon": "~2.3.0"
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@larvaexotech: o dzięki za kod i wskazówki.
Co do route 130 tak jest wykonywany.
Co do serializeUser tak jest wykonywany w momencie rządania po zalogowaniu.
Wszystko działa do momentu router.get(/lobby) wtedy nagle okazuje się, że req.user is undefined. Potwierdza to fakt, że gdy w serializeUser dodam obiekt user do listy obiektów a w router.get(/lobby) go sciągam i przekazuje do widoku to dostaje upragnione witaj xyz.
  • Odpowiedz
@SebixBezKaryny: no to nie wiem, ja bym po prostu wszedł w nodemodules i powrzucał console.logi do pakietu passport-facebook, w szczególności w momenty pomiędzy serializeUser() a rzeczywistym wykonywaniem requesta. możesz też sconsole.log'ować wszystko co się odbywa w kodzie middleware passport-facebook (zwracanym przez:
passport.authenticate('facebook', {scope: 'email'})
).

A w przypadku wykonywania serializeUser jesteś pewien że przekazujesz tam usera a nie null,
  • Odpowiedz
@larvaexotech: faktycznie w warunku !user logując się przez fb dostaję info, że tam wszedł natomiast logując się normalnie on tam nie wchodzi. Deserialize zwraca null'a w przypadku logowania przez fb.
Chyba wiem dlaczego. W życiu bym na to nie wpadł. Mam serializację i deserializację zrobioną tylko dla jednejj kolekcji a używam dwóch. Nie znajdzie więc on id użytkownika z fb w tabeli dla zwykłego usera który rejestrował się poprzez stronę.
  • Odpowiedz
@SebixBezKaryny: brawo :)

ps: w przypadku backendów warto zastanowić się nad użyciem webpacka i babela. ja osobiście projekty backendowe tworzę używając webpacka i babela w pełnym ES6. faktycznie męczące może być odpalanie webpack --watch przy tworzeniu projektu i deployu, ale async await robi robotę.

http://pastebin.com/WLz5Cpbi

I nagle JS przestaje być gówniany ( ͡° ͜ʖ ͡°)
  • Odpowiedz