2012-06-12 24 views
8

Sử dụng Mongoose.js, phương pháp xác thực của tôi sẽ điền trường "companyRoles._company", nhưng dữ liệu được điền lại sẽ trở lại ID tham chiếu của công ty khi Tôi cố gắng truy cập vào cùng một trường được điền trong đối tượng req.user của tôi.Passport.js và Mongoose.js điền Người dùng khi đăng nhập - mất trường được điền trên 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); 
}); 

Sau req.logIn, đăng req.user lãm - companyRoles {_company: [Object]}

Nhưng khi tôi chuyển hướng đến/công ty /: tuyến đường id sau khi đăng nhập, nó được hiển thị id và không phải là [đối tượng] dân cư - companyRoles {_company: 4fbe8b2513e90be8280001a5}

Bất kỳ ý tưởng nào về lý do tại sao trường này không được phổ biến? Cảm ơn.

Trả lời

12

Vấn đề là tôi đã không Populating lĩnh vực này trong hàm passport.deserializeUser, đây là chức năng Cập nhật:

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

Có vẻ như trong số res.redirect bạn đang cố gắng tạo URL bằng cách nối một đối tượng vào một chuỗi. Tôi nghi ngờ rằng sẽ có kết quả bạn muốn. Bạn mong đợi URL trông như thế nào?

+0

Cảm ơn ebohlman, bạn là chính xác. Tôi đã không cập nhật url chuyển hướng từ khi tôi trước đây không điền đối tượng _company. Tôi đã cập nhật mã cho đến nay có _company._id. –

+0

Mặc dù, vấn đề vẫn còn. Trong/companies/{companyId}, req.user.companyRoles [i] ._ công ty là một ObjectID và không phải là một đối tượng _company dân cư (tên, id, v.v.). Đó là lạ kể từ req.user là một đối tượng dân cư khi đăng nhập nó trong req.logIn gọi lại. –

+0

Tôi nghĩ bạn cần hiển thị mã xử lý '/ companies /: companyId'. Hãy nhớ rằng sau khi chuyển hướng, trình duyệt sẽ tạo một yêu cầu hoàn toàn mới và không có thuộc tính nào bạn đặt trên đối tượng 'req' ban đầu của bạn sẽ tự động xuất hiện trên đối tượng mới. – ebohlman

Các vấn đề liên quan