2015-02-24 37 views
8

我們有兩種類型的用戶,管理員和普通用戶。何時調用serialize和deserialize護照方法?它究竟設置了什麼?

passport.serializeUser(function(user, done) { 
    console.log('Sear'); 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    console.log(id); 
    console.log("Deser"); 
    User.findById(id, function(err, user) { 
    if(err) done(err); 
    if(user){ 
     done(null, user); 
    }else{ 
     vendorUser.findById(id, function(err, user){ 
     if(err) done(err); 
     done(null,user); 
     }); 
    } 
    }); 
}); 

CONSOLE.LOG獲取與文本

DESER

什麼是兩者的功能究竟做頻繁輸出(即使在一個單一的API請求)?一個詳細的答案表示讚賞。 TIA。

回答

19

序列化和反序列化是重要的概念。 要序列化對象意味着將其狀態轉換爲字節流,以便字節流可以恢復爲對象的副本。

在典型的Web應用程序中,用於認證用戶的憑證只會在登錄請求期間傳輸。如果驗證成功,會話將通過用戶瀏覽器中設置的cookie建立和維護。

每個後續請求將不包含憑據,而是標識會話的唯一cookie。 爲了支持登錄會話,Passport將序列化和反序列化會話中的用戶實例。

在您編寫的代碼中,只有用戶標識被序列化到會話中。當收到後續請求時,將使用此ID查找用戶,該用戶將恢復到req.user

爲了讓開發者能夠自由地使用他們想要的任何數據庫,無論他們想要序列化的數據如何,他們都可以用自己的方式完成,序列化和反序列化邏輯留給我們來實現。

+0

哪裏'user.id'來自文章?在我看到的大多數貓鼬模型中,對於用戶來說,有諸如'_id','name','password'等字段。字母'id'是任意的。我可以使用'done(null,user.cat);'? – 2016-01-22 04:53:04

+0

在MongoDB中,存儲在集合中的文檔需要一個唯一的_id字段作爲主鍵。如果未指定_id字段,則MongoDB使用ObjectIds作爲_id字段的默認值;即如果文檔不包含頂級_id字段,則MongoDB驅動程序添加包含ObjectId的_id字段。我建議你閱讀[this](https://docs.mongodb.org/manual/reference/object-id/)。序列化/反序列化基本上與對象本身有關,而不是單個值,所以儘量不要做** user.cat **,序列化**用戶**是對的。 – NarendraSoni 2016-01-22 09:14:50

+1

感謝您的回覆我知道您寫了關於'_id'我只是覺得它在護照的文檔中很奇怪,在教程中他們大多使用'user.id',文檔中沒有'id'字段。你明白爲什麼我覺得這很奇怪嗎?也暗示着,而不是使用'user.id'我可以使用'done(null,** user **);'只是用戶?或者如果有一個名字字段,可能是'user.name'。 – 2016-01-22 09:29:04

1

serializeUser是在登錄請求(在身份驗證期間)調用的方法,如果登錄成功,則會決定應將哪些用戶信息存儲在會話中,並將cookie發送到瀏覽器以便維護會議。

// Only during the authentication to specify what user information should be stored in the session. 
passport.serializeUser(function (user, done) { 
    console.log("Serializer : ", user) 
    done(null, user.id); 
}); 

上面的代碼片段會將user.id字段保存到會話和cookie中。

deserializeUser是在所有後續請求上調用並由passport.session中間件調用的方法。它使我們能夠爲每個請求加載額外的用戶信息。該用戶對象作爲req.user附加到請求中,使其可以在我們的請求處理中訪問。

Here is,說明它很好的流動

+0

爲什麼他的serializeUser被每個請求調用,它應該只有deserializeUser? – 2018-01-07 05:33:23