2012-06-12 4 views
8

Używając Mongoose.js, moja metoda uwierzytelniania wypełnia pole "companyRoles._company", ale zapełnione dane powracają do identyfikatora referencyjnego firmy, gdy Próbuję uzyskać dostęp do tego samego wypełnionego pola w moim obiekcie req.user.Passport.js i Mongoose.js zapełniają użytkownika przy logowaniu - tracą zaludnione pole na req.user

//Authentication 
UserSchema.static('authenticate', function(email, password, callback) { 
    this.findOne({ email: email }) 
    .populate('companyRoles._company', ['name', '_id']) 
    .run(function(err, user) { 
     if (err) { return callback(err); } 
     if (!user) { return callback(null, false); } 
     user.verifyPassword(password, function(err, passwordCorrect) { 
     if (err) { return callback(err); } 
     if (!passwordCorrect) { return callback(null, false); } 
     return callback(null, user); 
     }); 
    }); 
}); 

//login post 
app.post('/passportlogin', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { return res.redirect('/passportlogin') } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     console.log('req User'); 
     console.log(req.user); 
     return res.redirect('/companies/' + user.companyRoles[0]._company._id); 
    }); 
    })(req, res, next); 
}); 

app.get('/companies/:cid', function(req, res){ 
    console.log('req.user in companies:cid'); 
    console.log(req.user); 
}); 

Po req.logIn, rejestrowanie req.user przedstawia - companyRoles {_company [Obiekt]}

Ale kiedy przekierowania/firmy/route ID po zalogowaniu, że pokazuje id, a nie zaludniony [obiekt] - companyRoles {_company: 4fbe8b2513e90be8280001a5}

Jakieś pomysły, dlaczego pole nie jest zaludnione? Dzięki.

Odpowiedz

12

Problem polegał na tym, że nie wypełniania pola w funkcji passport.deserializeUser, tutaj jest aktualizowany funkcja:

//deserialize 
passport.deserializeUser(function(id, done) { 
    User.findById(id) 
    .populate('companyRoles._company', ['name', '_id']) 
    .run(function (err, user) { 
     done(err, user); 
    }); 
}); 
0

Wygląda na to, że próbujesz utworzyć adres URL, łącząc obiekt z łańcuchem znaków w swoim res.redirect. Wątpię, że przyniesie to pożądany skutek. Jakiego adresu URL powinien wyglądać?

+0

Dzięki ebohlman, masz rację. Nie zaktualizowałem adresu URL przekierowania z miejsca, w którym poprzednio nie wypełniałem obiektu _company. Zaktualizowałem kod, aby mieć teraz _company._id. –

+0

Problem nadal pozostaje. In/companies/{companyId}, req.user.companyRoles [i] ._ company to ObjectID, a nie zaludniony obiekt _company (name, id, etc). To dziwne, ponieważ req.user jest zapełnionym obiektem podczas rejestrowania go w wywołaniu zwrotnym req.logIn. –

+0

Myślę, że potrzebujesz pokazać kod, który obsługuje '/ company /: companyId'. Pamiętaj, że po przekierowaniu przeglądarka zrobi zupełnie nowe żądanie i żadna z właściwości ustawionych w twoim oryginalnym obiekcie 'req' nie pojawi się automatycznie na nowym. – ebohlman

Powiązane problemy