2016-04-03 17 views
3

Uygulamamda bir ödeme özelliği uyguluyorum ve sağlayıcım AccountId (kullanıcının sistemimde tanımlanması) ve Email. Passport.js ile açıklayamadığım bazı tuhaf davranışlar fark ettim. Her şeyden önce, seri kaldırma docs gibi görünür:Passport.js async vs sync deserialization

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

Şimdi, istek için veri oluştururlar zaman ancak, bu bir zaman uyumsuz operasyon olduğunu olsun, istiyorum: Bazıları için

var data = { 
    AccountId: toString(req.user._id), 
    Email: req.user.auth.local.email 
    // ... 
} 

Nedeni Email doğru şekilde ayarlanmış, ancak AccountId her zaman [object Undefined] değerini döndürür. Eh, belki de Pasport'un serileştirme sürecinin asenkron doğasından kaynaklandığını düşündüm (User.findById()'a zaman gerektiriyor), ama neden Email doğru ayarlandı?

AccountId ayarının req.session.passport.user ayarını buldum, ancak bana bir kesmek gibi görünüyor.

cevap

2

Senin sorunun buradadır:

AccountId: toString(req.user._id), 

toString bir nesnenin bir yöntemdir. Tarayıcıda, toString'i çağırmak, window.toString() anlamına geldiğini varsayar ve [object Window] döndürür. Düğümde, global pencere mevcut olmadığından, [object Undefined] alırsınız.

bence yolu şöyle olacağını işlevi çağırmak anlamına:

AccountId: req.user._id.toString(), 
+0

Çok teşekkürler, gerçekten de onu kullanmak içindir yoldur! –

+0

Yine de durumu 'User.findById() 'ile almıyorum, async olması gerekir. Node'un çözülmesini beklediği ve kodu bir sonraki döngüde işlediği anlamına mı geliyor? –

+1

@AntonEgorov Haklısınız, 'User.findById() 'async. Express, middleware 'done' işlevini çağırdıktan sonra, _after_ 'User.findById()' işlevini geri döndükten sonraya kadar rota işleme kodunu çalıştırmaya başlamıyor. –