2016-02-08 67 views
3

我相信我在處理Node.js驗證使用PassportJS(特別是passport-local)的競賽條件。Node.js護照登錄競賽條件

這是我Router登記:

router.post('/', upload.single('avatar'), function(req, res, next) { 
    var userType = req.body.userType; 
    var username = req.body.username; 
    var password = req.body.password; 
    var email = req.body.email; 
    // Convert Buffer data to base64 encoded string 
    var base64Avatar = new Buffer(req.file.buffer).toString('base64'); 
    var avatar = 'data:' + req.file.mimetype + ';base64,' + base64Avatar; 

    var createdUser; 
    if (userType == 'viewer') { 
     createdUser = new user.User(username, password, email, [], [], avatar).getInstance(); 
    } else if (userType == 'contributor') { 
     createdUser = new contributor.Contributor(username, password, email, [], [], avatar, []).getInstance(); 
    } 

    req.login(createdUser, function(err) { 
     if (err) { return next(err); } 
     req.session.save(function() { 
      res.redirect('/user/' + req.user.username); 
     }); 
    }); 
}); 

User模型constructor使用TypeScript

constructor(private _username: String, private _password: String, private\ 
_email: String, private _favorites: Array<any>, private _inbox: Array<any>, \ 
private _avatar: String) { 
     this._modelInstance = new userModel({username: _username, password: _\ 
password, email: _email, favorites: _favorites, inbox: _inbox, avatar: _avata\ 
r}); 
     this._modelInstance.save(); 
}; 

我試圖將async.series到:

一)模型實例的創建並保存在User類的構造中uctor。

b)createdUser創建在路由和req.login請求。

我也嘗試過(如您所見)手動保存session,並使用重定向作爲回調來確保會話已保存。我也研究過Buffer以及它似乎是同步的,所以我不認爲這是問題。

如果我使用短字符串(如myAvatar)調用User模型,那麼它將正確登錄用戶。只有當頭像字符串變大時纔會這樣。在這種情況下,用戶可以登錄後,但自動登錄不通過req.login執行。

這也是說,重定向到的用戶配置文件在登錄後沒有顯示,表明它正在保存模型之前嘗試登錄(配置文件頁面進行數據庫查詢,並且它不是還沒有找到任何東西)。然而,重定向後的刷新顯示了個人資料頁面上的數據。

我可以忽略某處的異步問題嗎?

回答

0

save()邏輯移動到註冊Router修復它。

然後,我可以簡單地將req.login調用添加到save()回調:

createdUser.save(function(err, data) { 
    if (err) { 
      console.log(err); 
    } else { 
     req.login(createdUser, function(err) { 
      if (err) { return next(err); } 
      req.session.save(function() { 
       res.redirect('/user/' + req.user.username); 
      }); 
     }); 
    } 
});